当varnish通过Purge
和Ban
使缓存无效时,它是否使用vcl_hash中定义的哈希键来帮助查找对象?如果我要通过自定义标头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);
}
}
答案 0 :(得分:1)
如果您正在执行BAN,那么它不需要匹配哈希,因为在查找对象时将应用BAN。
然而,PURGE会进行正常的对象查找,因此您无法使用备用密钥进行查找。
答案 1 :(得分:1)
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);
}