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

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

我的缓存设置类似于:

set $cache_key  "$uri?$args";

因此,使用不同顺序的查询字符串参数进入这些URL的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重复的缓存内容副本,因为查询字符串参数的顺序不同.有没有办法在设置缓存键之前按字母顺序排序它们以避免这种情况?还有其他方法可以优雅地解决这个问题吗?

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

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

转载注明原文:具有可变参数顺序的Nginx缓存 - 代码日志