首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Varnish缓存无效(按时间戳)

Varnish缓存无效(按时间戳)
EN

Stack Overflow用户
提问于 2021-11-03 16:33:30
回答 1查看 23关注 0票数 0

有没有办法通过时间戳来清除清漆缓存。我想删除昨天或任何特定时间戳的所有缓存响应。

EN

回答 1

Stack Overflow用户

发布于 2021-11-05 09:34:28

尽管VCL中有一个obj.age变量,但在Varish6.2之前的版本中,不能从ban()函数访问它。目前还包括我们的6.0 LTS版本。

在缓存中插入时间戳作为响应头

解决此问题的一种方法是在插入时在自定义标头中插入时间戳。

下面是一些示例VCL,其中我们将当前UNIX时间戳分配给time响应头:

代码语言:javascript
复制
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秒之前的。

我创建了以下正则表达式:

代码语言:javascript
复制
^1636103[7-8][0-9]{2}$

这将匹配16361037001636103899之间的所有时间戳,基于当前时间戳,时间戳的范围为199秒。

通过不匹配此模式的,将选择较旧的时间戳,这实际上就是诀窍。

我最终使用以下ban命令来匹配旧对象:

代码语言:javascript
复制
varnishadm ban obj.http.time '!~ ^1636103[7-8][0-9]{2}$'

根据需要定制正则表达式

在封禁之前,请确保您的VCL代码中添加了包含时间戳的自定义头部。此自定义标头将在您的ban命令中匹配。

根据您的需要,获取当前的UNIX时间戳,计算要匹配的范围,并创建一个执行反向匹配的正则表达式。

匹配Varish6.2中的obj.age

如果您使用的是Varnish 6.2或更高版本,则只需运行以下ban命令:

代码语言:javascript
复制
varnishadm ban obj.age '> 1d'

这将删除缓存中超过一天的所有对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69828506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档