具有可变参数顺序的Nginx缓存

时间:2012-01-19 23:49:59

标签: caching nginx

我正在使用基于请求URI的nginx生成缓存密钥,并查询直接检查memcache的params,然后如果找不到缓存密钥则从PHP-FPM提供页面。我的问题是,许多URL都有不同顺序的查询字符串选项,因此每个响应生成两个或多个单独的缓存键。

我的缓存设置如下:

set $cache_key  "$uri?$args";

因此,以不同顺序使用查询字符串参数进入的URL会最终为同一类型生成多个可能的缓存键:

http://example.com/api/2.2/events.json?id=53&type=wedding&sort=title&limit=10
http://example.com/api/2.2/events.json?id=53&limit=10&type=wedding&sort=title
http://example.com/api/2.2/events.json?id=53&limit=10&sort=title&type=wedding

n的恶心!可能性...

最终结果是,memcache的填充速度通常比它应该快得多,因为我有一个潜在的n!-1重复的缓存内容副本,因为查询字符串参数的顺序不同。有没有办法在设置缓存键之前按字母顺序排序以避免这种情况?还有其他方法可以优雅地解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

如果您知道哪些参数对缓存密钥生成很重要,那么您可以手动指定它们。根据你的例子,我写了下一个例子:

set $cache_key "$uri?id=$arg_id&type=$arg_type&sort=$arg_sort&limit=$arg_limit";

或者您可以使用嵌入式perl并编写自己的生成缓存密钥的函数,请参阅此处的示例http://wiki.nginx.org/Configuration#Embedded_Perl_examples

答案 1 :(得分:0)

假设您自己生成链接,而不是尝试在nginx中重新排序它们,您是否可以使用输出重写器来确保它们在页面生成时处于一致的顺序?