【问题标题】:Varnish Cache Invalidate by Timestamp清漆缓存因时间戳而失效
【发布时间】:2021-11-05 18:08:07
【问题描述】:

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

【问题讨论】:

    标签: varnish


    【解决方案1】:

    虽然 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}$
    

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

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

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

    varnishadm ban obj.http.time '!~ ^1636103[7-8][0-9]{2}$'
    

    根据您的需要自定义正则表达式

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

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

    从 Varnish 6.2 开始匹配 obj.age

    如果您使用的是 Varnish 6.2 或更新版本,您可以简单地运行以下禁令命令:

    varnishadm ban obj.age '> 1d'
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2012-04-03
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多