2012-01-19 11 views
8

मैं अनुरोध यूआरआई के आधार पर nginx के साथ एक कैश कुंजी उत्पन्न कर रहा हूं और क्वेरी पैराम जो सीधे मेमकेच की जांच करता है और फिर कैश कुंजी नहीं मिलने पर PHP-FPM से पृष्ठ परोसता है। मेरी समस्या यह है कि कई यूआरएल में क्वेरी स्ट्रिंग विकल्प होते हैं जो अलग-अलग ऑर्डर में आते हैं और इस प्रकार प्रति प्रतिक्रिया दो या दो से अधिक अलग कैश कुंजी उत्पन्न करते हैं।चरम परम क्रम के साथ Nginx कैशिंग

मेरे कैश सेटिंग है कुछ की तरह:

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 

एन के लिए विज्ञापन मतली! संभावनाएं ...

अंत परिणाम यह है कि memcache अक्सर इसके मुकाबले बहुत तेज हो जाता है क्योंकि मेरे पास कैश की गई सामग्री की संभावित एन! -1 डुप्लिकेट प्रतियां होती हैं क्योंकि क्वेरी स्ट्रिंग पैरामीटर एक अलग क्रम में आते हैं। क्या इससे बचने के लिए कैश कुंजी सेट करने से पहले मैं उन्हें वर्णानुक्रमित कर सकता हूं? इस मुद्दे को सुन्दर तरीके से हल करने के अन्य तरीके हैं?

उत्तर

2

यदि आप जानते हैं कि कैश कुंजी पीढ़ी के लिए कौन से पैरामीटर महत्वपूर्ण हैं तो आप उन्हें मैन्युअल रूप से निर्दिष्ट कर सकते हैं। अपने उदाहरण के आधार पर मैं अगले उदाहरण लिखा है:

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

या आप एम्बेडेड पर्ल का उपयोग करें और अपने खुद के समारोह है कि कैश कुंजी उत्पन्न होगा लिख ​​सकता है, कृपया यहाँ उदाहरण http://wiki.nginx.org/Configuration#Embedded_Perl_examples

+0

समस्या यह है कि कई सारे कई एपीआई कॉल प्रत्येक के पैरामीटर के सेट के साथ हैं। उनमें से कुछ 'सीमा' की तरह अधिक वैश्विक हैं, लेकिन उनमें से अधिकतर एपीआई-कॉल निर्भर हैं। एम्बेडेड पर्ल लिंक के लिए धन्यवाद - मैं अन्य समाधानों पर प्रतीक्षा करते समय इसे देख लूंगा। –

0

देखना मुमकिन है आप लिंक अपने आप को तैयार कर रहे होते , nginx में उन्हें फिर से ऑर्डर करने की कोशिश करने के बजाय, क्या आप यह सुनिश्चित करने के लिए आउटपुट री-लेखक का उपयोग कर सकते हैं कि वे पेज पीढ़ी पर लगातार क्रम में हैं?

+0

हां मैं कर सकता हूं, लेकिन यह विशेष एपीआई कई मोबाइल ऐप और जेएस विगेट्स द्वारा खाया जाता है, जिनमें से कुछ तीसरे पक्ष हैं, इसलिए हर जगह लागू करना बहुत मुश्किल है। –

+0

यह आंशिक रूप से बेकार है, लेकिन क्या आप चर के साथ अधिक विस्तृत हो सकते हैं। और सभी संभावित कुंजी के साथ कैश कुंजी $ uri होने के लिए सेट करें? टाइप = $ arg [type] और sort = $ arg [sort] और limit = $ arg [limit] इत्यादि। – preinheimer

+0

क्या होता है यदि वर्तमान अनुरोध में विशेष '$ arg [somekey]' मौजूद नहीं है? वह दृष्टिकोण केवल तभी काम करेगा यदि nginx गैर-मौजूद क्वेरी पैरामीटर कुंजी के बारे में किसी प्रकार की त्रुटियों को फेंक नहीं देता है। –

संबंधित मुद्दे