2012-01-19 6 views
8

Estoy generando una clave de caché con nginx basada en el URI de solicitud y parámetros de consulta que verifican Memcache directamente y luego sirven la página de PHP-FPM si no se encuentra una clave de caché. Mi problema es que muchas URL tienen opciones de cadena de consulta que vienen en diferentes órdenes y generan dos o más claves de caché separadas por respuesta.Caché de Nginx con orden de parámetro variable

Mi configuración de caché es algo así como:

set $cache_key "$uri?$args"; 

Así URL que vienen en como estos con parametros de cadena de consulta en diferentes órdenes terminan generando múltiples claves de caché posibles para el mismo tipo:

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 

Ad nauseum for n! posibilidades ...

El resultado final es que la memcache a menudo se llena mucho más rápido de lo debido porque tengo un potencial n! -1 copias duplicadas de contenido en caché simplemente porque los parámetros de cadena de consulta vienen en un orden diferente. ¿Hay alguna manera de ordenarlos alfabéticamente antes de configurar la clave de caché para evitar esto? ¿Hay otras maneras de resolver este problema elegantemente?

Respuesta

2

si conoce qué parámetros son importantes para la generación de la clave de caché, entonces puede especificarlos manualmente. Basado en su ejemplo que escribí siguiente ejemplo:

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

O usted podría utilizar Perl embebido y escribir su propia función que va a generar clave de caché, por favor ver ejemplos aquí http://wiki.nginx.org/Configuration#Embedded_Perl_examples

+0

El problema es que hay muchas, muchas posibles llamadas a la API, cada una con su propio conjunto de parámetros. Algunos de ellos son más globales como 'limit', pero la mayoría de ellos dependen de las llamadas API. Gracias por el enlace de Perl incrustado: lo verificaré mientras espero otras soluciones. –

0

Es de suponer que se está generando los enlaces usted mismo , en lugar de tratar de reordenarlos en nginx, ¿podrías usar una nueva escritura de salida para asegurarte de que están en un orden constante en la generación de la página?

+0

Sí puedo, pero esta API particular es consumida por múltiples aplicaciones móviles y widgets JS, algunos de los cuales son de terceros, por lo que es muy difícil de aplicar en todas partes. –

+0

Esto apesta parcialmente, pero puede obtener más detalles con las variables. y establecer la clave de caché para que sea $ uri? type = $ arg [type] & sort = $ arg [sort] & limit = $ arg [limit] etc. etc. con todas las teclas posibles? – preinheimer

+0

¿Qué sucede si el '$ arg [alguna clave]' en particular no existe en la solicitud actual? Ese enfoque solo funcionará si nginx no arroja ningún tipo de error sobre las claves de parámetros de consulta inexistentes. –

Cuestiones relacionadas