proxy_cache_lock_age 控制上一个回源完成后多长时间内禁止新回源,是缓存刷新的最小时间间隔;它与 proxy_cache_lock_timeout 协同,前者防密集刷,后者防长尾阻塞,共同优化高负载下的缓存更新节奏。

proxy_cache_lock_age 的作用不是控制“等待锁的时长”,而是决定:上一个回源请求完成之后,隔多久才允许下一个同类请求再次触发回源。它和 proxy_cache_lock_timeout 协同工作,共同调节高负载下缓存更新的并发节奏。
理解 lock_age 的真实语义
当第一个请求抢到锁、回源并写入缓存后,Nginx 并不会立刻“永久封禁”后续回源——否则缓存永远无法刷新。lock_age 就是这个“冷却期”的长度:
- 若设为
proxy_cache_lock_age 5s,表示该缓存项在上次成功回源后的 5 秒内,即使缓存已过期或被清除,其他请求也不会再触发新回源(除非锁未释放完就超时) - 它只对“刚完成回源”的缓存项生效;若缓存根本不存在或已 stale 多时,lock_age 不起作用,此时由 lock_timeout 控制排队行为
- 它的单位是时间,不是请求数或连接数,本质是“最小刷新间隔”的软约束
高负载下推荐的 lock_age 设置策略
在流量峰值或后端响应不稳时,盲目缩短 lock_age 可能引发重复回源雪崩;过长又导致缓存陈旧。需结合业务容忍度与后端承载力权衡:
- 对强一致性要求低、内容更新不频繁的接口(如静态页、公告),可设为
10s–30s,大幅降低刷新频次 - 对时效性中等的接口(如用户资料、商品摘要),建议
5s–8s,平衡新鲜度与压力 - 避免设为
0s或极小值(如1s):这等于取消冷却,失去 lock_age 的设计意义,容易让多个请求在毫秒级窗口内连续触发回源 - 若配合
proxy_cache_background_update on,lock_age 可适当放宽(如15s),因后台更新已接管刷新任务,前台请求更倾向走 stale 缓存
与 lock_timeout 的协同调优要点
二者不是替代关系,而是分阶段控制:
-
proxy_cache_lock_timeout 3s:告诉等待队列,“最多等 3 秒,超时就自己去回源”——这是防长尾阻塞 -
proxy_cache_lock_age 5s:告诉系统,“就算你等到了、也回源成功了,接下来 5 秒内别让别人再试”——这是防密集刷 - 典型组合示例:
lock_timeout 4s; lock_age 6s。意味着:单次锁争用最多拖住请求 4 秒;而两次有效回源之间至少间隔 6 秒,中间的请求要么命中缓存,要么走proxy_cache_use_stale updating返回旧内容 - 若观察日志发现大量
HIT-STALE或UPDATING状态,说明 lock_age 偏长或后端太慢,可微调两者比例,但优先检查上游响应时间是否异常
验证 lock_age 是否生效的关键指标
仅靠配置不能保证效果,需通过日志和监控确认实际行为:
- 开启 Nginx 日志变量:
$upstream_http_x_cache_status,关注是否出现连续多个MISSTIMEOUT(锁超时后回源)或UPDATING(后台更新中) - 对比同一 key 的多次请求时间戳:若两个回源请求间隔稳定大于 lock_age 值,说明机制起效;若频繁出现
- 注意:lock_age 不影响
proxy_cache_valid定义的过期逻辑,它只干预“谁来刷新”和“何时允许再刷新”,不改变缓存是否过期的判定


















