如何按时间戳实现Varnish Cache缓存失效及内容清除
按时间戳清除Varnish缓存的实现方法
Varnish原生没有直接内置按时间戳批量清除缓存的命令,但可以通过ban规则快速实现该需求,以下是两种常用操作方式:
方法1:无需修改VCL,直接通过varnishadm执行
- 首先计算你要清除的时间节点的Unix时间戳,比如要清除昨日0点之前的所有缓存,可执行命令获取时间戳:
date -d "yesterday 00:00" +%s
命令执行后会输出对应时间的10位Unix时间戳,示例输出为1717123200 - 执行ban命令完成清除:
varnishadm ban "now - obj.age < 1717123200"
表达式说明:now是Varnish当前的Unix时间戳,obj.age是缓存对象已存在的秒数,
now - obj.age就是缓存对象的生成时间戳,满足小于指定时间戳的所有缓存对象都会被批量清除。
方法2:添加VCL规则,支持通过HTTP请求触发清除
如果需要远程调用清除能力,可以修改VCL配置添加专用的清除逻辑:
- 在vcl_recv段添加如下配置:
acl purge_allowed { "127.0.0.1"; # 可添加其他允许操作的IP段 } sub vcl_recv { # 校验PURGE操作权限 if (req.method == "PURGE") { if (!client.ip ~ purge_allowed) { return(synth(405, "Operation not allowed")); } # 按时间戳清除逻辑 if (req.http.X-Purge-Before-Timestamp) { ban("now - obj.age < " + req.http.X-Purge-Before-Timestamp); return(synth(200, "Successfully purged all cache before timestamp " + req.http.X-Purge-Before-Timestamp)); } # 原有其他PURGE逻辑可保留在下方 } # 原有其他vcl_recv逻辑保留 }
- 重载VCL配置后,即可通过curl发起请求执行清除,示例如下:
curl -X PURGE -H "X-Purge-Before-Timestamp: 1717123200" http://127.0.0.1
注意事项
- 操作前可执行
varnishadm ban.list查看当前已有的ban规则,避免误操作 - 批量清除后首次访问已清除的缓存资源会触发回源,建议在业务低峰期执行操作
- 务必做好PURGE操作的权限控制,不要对公网开放相关操作入口,避免恶意清除缓存影响业务
内容的提问来源于stack exchange,提问作者user2272943
相关产品推荐
相关产品推荐

