首页/云/云网络与负载均衡速查/递归缓存与本地缓存
云 DNS 与 CDN49 条

递归缓存与本地缓存

解析结果先经「权威 → 递归(公共/运营商 DNS)→ 操作系统 → 应用」多级缓存:变更不生效多是缓存未过期。定位看 dig 输出中的剩余 TTL,清理顺序从本机到浏览器,递归层只能等过期。

解析结果经过多级缓存

一次域名访问的解析结果会依次经过「权威服务器 -> 递归服务器(公共或运营商 DNS)-> 操作系统缓存 -> 应用或浏览器缓存」。改完解析却「不生效」,绝大多数是某一级缓存还没过期。定位方法是看 dig 输出里的剩余 TTL:递减说明仍在缓存期内;清理顺序只能从本机到浏览器,递归层的缓存只能等过期。

基本信息

缓存层级权威 TTL 到递归缓存、系统缓存、应用缓存
清理顺序本机缓存、浏览器缓存,递归层不可直接清理
判断依据响应中的剩余 TTL 递减说明仍处于缓存期
控制手段变更前先调低 TTL,缩短切换窗口
常见误判把递归缓存当成可以主动清理的对象

典型使用场景

  • 解析切换后部分用户仍访问旧地址,确认缓存未过期
  • 变更前把 TTL 调低,等旧记录过期再切,缩短生效时间
  • 排查「本机查是新的、业务机器查是旧的」这类差异
  • 容器或虚拟机内 DNS 配置与宿主机不一致,导致结果不同
  • 应用内自建 DNS 缓存导致长连接指向旧地址

对照权威与递归结果

对照权威与递归结果
dig www.example.com +noall +answer          # 看本机递归结果的剩余 TTL
dig +short www.example.com @8.8.8.8          # 对照公共 DNS 的结果
# 直接问权威服务器,绕过递归缓存
dig +short www.example.com @ns1.example.com
# 清本机缓存(systemd-resolved 环境)
sudo resolvectl flush-caches

缓存层级与可控性

层级谁在缓存能否清理
权威服务器记录的所有者修改记录本身
递归服务器公共或运营商 DNS不可直接清理
操作系统本机 resolver可用命令清理
浏览器与应用客户端进程重启或刷新可清理
运营商与公共递归缓存无法直接清理,切换类变更要靠提前调低 TTL 来控制窗口,这是唯一可靠的手段。
变更前没有预降 TTL,等于把生效时间交给未知的递归缓存;遇到故障回滚时同样会被缓存拖慢。

易错点

  • 只刷新浏览器就以为清理完成,忽略操作系统与递归层缓存
  • 把运营商或公共递归缓存当作可清理对象,浪费大量排查时间
  • 变更前未预降 TTL,切换与回滚都被旧缓存拖慢
  • 忽略了应用内自建缓存或长连接,解析已更新但业务仍连旧地址

数据来源与参考

  • DNS 缓存机制(RFC 1034/1035)
  • 公共 DNS 服务说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌