【发布时间】:2021-11-05 18:08:07
【问题描述】:
有没有办法通过时间戳清除清漆缓存。我想删除昨天或任何特定时间戳的所有缓存响应。
【问题讨论】:
标签: varnish
有没有办法通过时间戳清除清漆缓存。我想删除昨天或任何特定时间戳的所有缓存响应。
【问题讨论】:
标签: varnish
虽然 VCL 中有一个 obj.age 变量,但在 6.2 之前的 Varnish 版本中无法通过 ban() 函数访问它。目前还包括我们的 6.0 LTS 版本。
解决此问题的一种方法是在插入时在自定义标头中插入时间戳。
这是一些示例 VCL,我们将当前 UNIX 时间戳分配给 time 响应标头:
vcl 4.1;
import std;
sub vcl_backend_response {
set beresp.http.time = std.real2integer(std.time2real(now,0),0);
}
sub vcl_deliver {
unset resp.http.time;
}
通过在sub vcl_backend_response 中分配该值,我们确保该值作为响应标头的一部分存储在缓存对象中。
ban() 函数可以匹配任何响应标头。但由于ban() 没有> 或< 运算符,我们将不得不使用正则表达式。
在测试时,我的一个对象以1636103641 作为其时间戳。当前时间戳是1636103870,这意味着缓存中的对象是229 秒。
我创建了以下正则表达式:
^1636103[7-8][0-9]{2}$
这匹配 1636103700 和 1636103899 之间的所有时间戳,这是一个 199 秒的范围,基于当前时间戳。
通过 NOT 匹配此模式,将选择较旧的时间戳,这实际上就是诀窍。
我最终使用以下禁令命令来匹配旧对象:
varnishadm ban obj.http.time '!~ ^1636103[7-8][0-9]{2}$'
在禁止之前,请确保将包含时间戳的自定义标头添加到您的 VCL 代码中。此自定义标头将在您的
ban命令中匹配。
根据您的需要,获取当前的 UNIX 时间戳,计算您想要匹配的范围并创建一个进行 反向匹配的正则表达式。
如果您使用的是 Varnish 6.2 或更新版本,您可以简单地运行以下禁令命令:
varnishadm ban obj.age '> 1d'
这将删除已在缓存中超过一天的所有对象。
【讨论】: