2012-01-19 13 views
8

Sto generando una cache key con nginx in base all'URI della richiesta e ai parametri di query che controllano memcache direttamente e quindi serve la pagina da PHP-FPM se non viene trovata una chiave di cache. Il mio problema è che molti URL hanno opzioni di stringhe di query che arrivano in ordini diversi e quindi hanno generato due o più chiavi cache separate per risposta.Nginx caching con ordine param variabile

La mia impostazione della cache è qualcosa di simile:

set $cache_key "$uri?$args"; 

Così gli URL che vengono in come questi con params stringa di query in diversi ordini finiscono per generare più chiavi di cache possibili per lo stesso 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 per n! possibilità ...

Il risultato finale è che Memcache spesso si riempie molto più velocemente di quanto dovrebbe perché ho un potenziale n! C'è un modo in cui posso ordinarli alfabeticamente prima di impostare la chiave di cache per evitare questo? Ci sono altri modi per risolvere elegantemente questo problema?

risposta

2

se si conoscono i parametri importanti per la generazione della cache, è possibile specificarne manualmente. Sulla base di tuo esempio ho scritto esempio successivo:

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

Oppure si potrebbe usare perl incorporato e scrivere la propria funzione che genera chiave di cache, vedere esempi qui http://wiki.nginx.org/Configuration#Embedded_Perl_examples

+0

Il problema è che ci sono molte, molte possibili chiamate API ciascuna con il proprio set di parametri. Alcuni di questi sono più globali come 'limite', ma la maggior parte di essi sono dipendenti dalle chiamate API. Grazie per il collegamento Perl incorporato: lo verificherò mentre aspetto altre soluzioni. –

0

Presumibilmente si sta generando i link da soli , invece di provare a riordinarli in nginx, potresti usare un re-writer di output per assicurarti che siano in ordine coerente alla generazione della pagina?

+0

Sì, ma questa particolare API viene utilizzata da più app mobili e widget JS, alcuni dei quali sono di terze parti, quindi è molto difficile applicarli ovunque. –

+0

Questo fa schifo parzialmente, ma puoi ottenere maggiori dettagli con le variabili. e imposta la chiave della cache come $ uri? type = $ arg [tipo] & sort = $ arg [sort] & limit = $ arg [limite] ecc. ecc. con tutte le chiavi possibili? – preinheimer

+0

Cosa succede se il particolare '$ arg [somekey]' non esiste nella richiesta corrente? Questo approccio funziona solo se nginx non lancia alcun tipo di errore sulle chiavi dei parametri di query inesistenti. –