我正在使用基于请求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