有没有办法通过时间戳来清除清漆缓存。我想删除昨天或任何特定时间戳的所有缓存响应。
发布于 2021-11-05 09:34:28
尽管VCL中有一个obj.age变量,但在Varish6.2之前的版本中,不能从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()函数匹配。但由于ban()没有>或<运算符,因此我们必须使用正则表达式。
在测试时,我的一个对象的时间戳是1636103641。当前的时间戳是1636103870,这意味着缓存中的对象是229秒之前的。
我创建了以下正则表达式:
^1636103[7-8][0-9]{2}$这将匹配1636103700和1636103899之间的所有时间戳,基于当前时间戳,时间戳的范围为199秒。
通过不匹配此模式的,将选择较旧的时间戳,这实际上就是诀窍。
我最终使用以下ban命令来匹配旧对象:
varnishadm ban obj.http.time '!~ ^1636103[7-8][0-9]{2}$'根据需要定制正则表达式
在封禁之前,请确保您的VCL代码中添加了包含时间戳的自定义头部。此自定义标头将在您的
ban命令中匹配。
根据您的需要,获取当前的UNIX时间戳,计算要匹配的范围,并创建一个执行反向匹配的正则表达式。
匹配Varish6.2中的obj.age
如果您使用的是Varnish 6.2或更高版本,则只需运行以下ban命令:
varnishadm ban obj.age '> 1d'这将删除缓存中超过一天的所有对象。
https://stackoverflow.com/questions/69828506
复制相似问题