2013-06-16 7 views
7

मेरे पास 3,5 लाख रिकॉर्ड (रीडोनली) वास्तव में एक MySQL डीबी में संग्रहीत हैं जो मैं प्रदर्शन कारणों से रेडिस को खींचना चाहता हूं। वास्तव में, मैं Redis में इस तरह बातें स्टोर करने के लिए प्रबंधित किया है:रेडिस पूर्ण पाठ खोज: रिवर्स इंडेक्सिंग या सनस्पॉट?

1 {"type":"Country","slug":"albania","name_fr":"Albanie","name_en":"Albania"} 
2 {"type":"Country","slug":"armenia","name_fr":"Arménie","name_en":"Armenia"} 
... 

कुंजी मैं यहाँ का उपयोग करें, विरासत MySQL आईडी है तो कुछ रूबी गोंद के साथ, मैं इस मौजूदा अनुप्रयोग में संभव के रूप में कम बातें तोड़ सकते हैं (और यह यहां एक गंभीर चिंता है)।

अब समस्या तब होती है जब मुझे मूल्य भाग के अंदर "अर्मेनिया" कीवर्ड पर कोई खोज करने की आवश्यकता होती है। लगता है की तरह केवल दो तरीके आउट:

  • आईडी => JSON मूल्यों (जैसा कि ऊपर दिखाया गया है)
  • स्लग => आईडी (स्लग के आधार पर अनुक्रमण रिवर्स:

    या तो मैं Redis सूचकांक multiplicate , कि बुनियादी खोज चाल अंत में एक और विशाल सूचकांक विशेष रूप से स्वत: पूर्ण के लिए, के रूप में इस पोस्ट में दिखाया गया है कर सकता है)

  • ,: http://oldblog.antirez.com/post/autocomplete-with-redis.html

या तो मैं या कुछ पूर्ण पाठ खोज इंजन (दुर्भाग्य से, मैं वास्तव में ThinkingSphinx जो बहुत ज्यादा

तो :-(MySQL से जुड़ा हुआ है का उपयोग सूर्यकलंक उपयोग करते हैं, आप क्या करेंगे? क्या आपको लगता है कि MySQL से Redis को एक टेबल के स्थानांतरित करना भी एक अच्छा विचार है? मुझे मेमोरी पदचिह्न से डर है कि उन विशाल रेडिस कुंजी/मान 16 जीबी रैम सर्वर पर ले सकते हैं।

इसी तरह के रेडिस उपयोग पर कोई प्रतिक्रिया?

उत्तर

4

इससे पहले कि मैं एक वास्तविक उत्तर से शुरू करता हूं, मैं यह उल्लेख करना चाहता था कि मुझे यहां रेडिस का उपयोग करने का एक अच्छा कारण नहीं दिख रहा है। किस तरह के उपयोग के मामलों के आधार पर आप ऐसा करने की कोशिश कर रहे हैं, ऐसा लगता है जैसे elasticsearch आपके लिए अधिक उपयुक्त होगा।

कहा कि, अगर आप बस अपने JSON के भीतर कुछ अलग अलग क्षेत्रों के लिए खोज करने के लिए सक्षम होना चाहते हैं, आपके पास दो विकल्प मिल गया है:

  1. सहायक सूचकांक कि field_key -> list_of_ids (आपके मामले में बताते हैं, "आर्मेनिया "-> 1)।
  2. जेएसओएन एन्कोडिंग और डिकोडिंग के साथ रेडिस के शीर्ष पर लुआ का उपयोग करें जो आप चाहते हैं उसे प्राप्त करने के लिए करें। यह तरीका अधिक लचीला और अंतरिक्ष कुशल है, लेकिन आपकी तालिका बढ़ने के साथ धीमा हो जाएगा।

फिर से, मुझे नहीं लगता कि यह आपके लिए उपयुक्त है क्योंकि ऐसा लगता है कि रेडिस आपके लिए एक अच्छा विकल्प नहीं है, लेकिन यदि आपको जरूरी है, तो उन्हें काम करना चाहिए।

+0

हाँ एली, आखिरकार ऐसा लगता है कि आप पूरी तरह से सही हैं। मैंने अंत तक अपना प्रयोग किया और रेडिस बनाम थिंकिंगस्फिनक्स इंडेक्सिंग का उपयोग कर एक रिवर्स इंडेक्स आधारित खोज को बेंचमार्क किया ... थिंकिंगस्फिनक्स ने युद्ध जीता (लगभग 30% तेज)। तो आप सही हैं, मुझे लगता है कि रेडिस सिर्फ सही उपकरण नहीं है, मैं स्फिंक्स का उपयोग करना जारी रखूंगा जो पागल तेज़ है (और मेरी विरासत माईएसक्यूएल डीबी जो पागल है, जो पढ़ने वाले डेटा से भरा है ...) – gbarillot

+0

वैसे, आप में केवल एफवाईआई इस पर जा रहे हैं, 3 लाख रिकॉर्ड सेट 650 एमओ रैम में फिट बैठता है, इसलिए यह एक कम महत्वपूर्ण मुद्दा था जिसकी शुरुआत में मुझे उम्मीद थी – gbarillot

2

यहां रेडिस पर मेरा लेना है। असल में मैं इसे एक इन-मेमोरी कैश के रूप में सोचता हूं जिसे कम से कम हाल ही में उपयोग किए गए डेटा (एलआरयू) को स्टोर करने के लिए कॉन्फ़िगर किया जा सकता है। मेरे उपयोग के मामले में मैंने जो भूमिका निभाई है, वह तर्क जो आपके उपयोग के मामले के बारे में सोचने में आपकी मदद करने के लिए लागू हो सकता है।

मैं वर्तमान में किसी अन्य डीबी (आपके मामले के समान) में डेटा द्वारा समर्थित कुछ जटिल प्रश्नों (धीमी) के आधार पर एक खोज इंजन के परिणामों को कैश करने के लिए रेडिस का उपयोग कर रहा हूं। इसलिए रेडिस सवालों के जवाब देने के लिए कैश स्टोरेज के रूप में कार्य करता है। रेडिस या डीबी में सभी प्रश्नों को या तो डेटा परोस दिया जाता है यदि यह रेडिस में कैश-मिस है। तो, ध्यान दें कि रेडिस डीबी की जगह नहीं ले रहा है, लेकिन केवल मेरे मामले में कैश के माध्यम से एक विस्तार है। यह मेरे विशिष्ट उपयोग मामले में फिट है, क्योंकि रेडिस के अतिरिक्त भविष्य की स्केलेबिलिटी की सहायता करना था। विचार यह है कि हाल के आंकड़ों की बार-बार पहुंच (मेरे मामले में, यदि कोई उपयोगकर्ता बार-बार पूछताछ करता है) रेडिस द्वारा परोसा जा सकता है, और डीबी से कुछ लोड ले सकता है।

असल में मेरी रेडिस स्कीमा कुछ हद तक आपकी इंडेक्स के डुप्लिकेशंस की तरह दिख रही है जो आपने ऊपर उल्लिखित है। मैंने रेडिस-चाबियों के "बैच/सेट" बनाने के लिए सेट्स और सॉर्ट किए गए सेट्स का इस्तेमाल किया, जिनमें से प्रत्येक ने एक विशेष रेडिस-कुंजी के तहत संग्रहीत विशिष्ट क्वेरी परिणामों की ओर इशारा किया। और डीबी में, मेरे पास अभी भी पूरा डेटा सेट और एक इंडेक्स था।

यदि आपका डेटा सेट रैम पर फिट बैठता है, तो आप रेडिस में "टेबल डंप" कर सकते हैं, और MySQL की आवश्यकता से छुटकारा पा सकते हैं। मैं यह काम देख सकता हूं, जब तक आप लगातार रेडिस स्टोरेज की योजना बनाते हैं और अपने डेटा के संभावित विकास के लिए योजना बनाते हैं, यदि भविष्य में यह "टेबल" बढ़ेगी।

तो आपके वास्तविक उपयोग के मामले के आधार पर और आप अपने ढेर में रेडिस फिटिंग को कैसे देखते हैं, और आपके डीबी द्वारा लोड किए जाने वाले लोड को देखते हुए, ऊपर दिए गए दोनों विकल्पों को करने की संभावना से इंकार न करें (जो खुश हैं मेरा मामला)।

आशा है कि इससे मदद मिलती है!

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