Varnish 4 在清除或禁止时是否使用哈希键查找 objects?

Does Varnish 4 use hash key to look up objects when purging or banning?

当 varnish 通过 PurgeBan 使缓存无效时,它是否使用 vcl_hash 中定义的散列键来帮助查找 objects?如果我要通过自定义 header obj.http.page_id 而不是此 article 推荐的 obj.http.url 使缓存无效,它会影响性能吗,因为哈希键不使用http.page_id?我在文档中没有看到任何提及这一点,但想在使用新方法之前弄清楚。

   sub vcl_recv {

      if (req.method == "PURGE") {

        if (!client.ip ~ purge) {

            return (synth(405, "Not allowed."));
        }

        ban("obj.http.url ~ ^" + req.url);

        return (purge);
      }
   }

   sub vcl_hash {
        hash_data(req.url);
        if (req.http.host) {
            hash_data(req.http.host);
        } else {
            hash_data(server.ip);
        }
   }

如果您正在执行 BAN,则它不需要匹配哈希,因为 BAN 将在查找对象时应用。

但是,PURGE 将进行正常的对象查找,因此您无法使用备用键进行查找。

BAN 比 PURGE 涉及更多。 PURGE 必须与 vcl_hash() 返回的值完全匹配 obj。 BAN 可以使用正则表达式并放在 BAN 列表中。每个传入的请求都必须检查 BAN 列表以确定缓存是否包含陈旧数据。如果 BAN 的数量太大,遍历每个请求的 BAN 列表可能会导致性能下降。好消息是 BAN 被 ban-lurker-thread 删除,它遍历缓存并将缓存中对象的时间戳与 BAN 请求的时间戳进行比较。如果没有时间戳早于与 BAN 的正则表达式匹配的 BAN 请求的缓存对象,则 BAN 将从列表中删除,因为它不再有用。

为 PURGE 和 BAN 设置单独的条件可能会有用:

if (req.method == "BAN")
{
    // TODO: Add client validation as needed
    ban("obj.http.x-url ~ " + req.url);
    return(synth(901, "BAN Set for " + req.url));
}

if (req.method == "PURGE")
{
    // TODO: Add client validation as needed
    return(purge);
}