caching - Memcached बनाम Redis?




web-applications (12)

सारांश (टीएल; डीआर)

3 जून, 2017 को अपडेट किया गया

Redis अधिक शक्तिशाली, अधिक लोकप्रिय, और memcached से बेहतर समर्थित है। Memcached केवल Redis कर सकते हैं चीजों का एक छोटा सा अंश कर सकते हैं। रेडिस बेहतर है जहां उनकी विशेषताएं ओवरलैप होती हैं।

कुछ भी नया के लिए, रेडिस का प्रयोग करें।

मेमकैड बनाम रेडिस: डायरेक्ट तुलना

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

घ्यान देने योग्य बातें

जब एक ही चीज़ के लिए उपयोग किया जाता है, तो यहां बताया गया है कि वे मूल प्रश्न के "विचारों पर विचार" का उपयोग करके तुलना कैसे करते हैं:

  • पढ़ें / लिखने की गति : दोनों बेहद तेज़ हैं। बेंचमार्क वर्कलोड, संस्करणों और कई अन्य कारकों से भिन्न होते हैं लेकिन आम तौर पर रेडिस को जितना तेज या लगभग उतना तेज़ लगता है। मैं रेडिस की सलाह देता हूं, लेकिन इसलिए नहीं क्योंकि memcached धीमा है। यह।
  • मेमोरी उपयोग : रेडिस बेहतर है।
    • memcached: आप कैश आकार निर्दिष्ट करते हैं और जैसे ही आप आइटम डालते हैं, डेमॉन जल्दी से इस आकार की तुलना में थोड़ा अधिक बढ़ता है। Memcached को पुनरारंभ करने के लिए, उस स्थान में से किसी भी को पुनः प्राप्त करने का वास्तव में कोई तरीका नहीं है। आपकी सभी चाबियाँ समाप्त हो सकती हैं, आप डेटाबेस को फ्लश कर सकते हैं, और यह अभी भी आपके द्वारा कॉन्फ़िगर किए गए रैम के पूर्ण हिस्से का उपयोग करेगा।
    • रेडिस: अधिकतम आकार निर्धारित करना आपके ऊपर है। रेडिस इसे कभी भी अधिक उपयोग नहीं करेगा और आपको वापस स्मृति देगा जो अब इसका उपयोग नहीं कर रहा है।
    • मैंने दोनों में यादृच्छिक वाक्यों के 100,000 ~ 2 केबी तार (~ 200 एमबी) संग्रहित किए। मेमकैड रैम का उपयोग ~ 225 एमबी तक बढ़ गया। रेडिस रैम का उपयोग ~ 228 एमबी तक बढ़ गया। दोनों को फ्लश करने के बाद, रेडिस ~ 2 9 एमबी तक गिर गई और memcached ~ 225MB पर रहे। वे समान रूप से कुशल हैं कि वे डेटा कैसे स्टोर करते हैं, लेकिन केवल एक ही इसे पुनः प्राप्त करने में सक्षम है।
  • डिस्क I / O डंपिंग : रेडिस के लिए एक स्पष्ट जीत क्योंकि यह डिफ़ॉल्ट रूप से करता है और इसमें बहुत विन्यास योग्यता होती है। Memcached के पास तीसरे पक्ष के उपकरण के बिना डिस्क पर डंपिंग के लिए कोई तंत्र नहीं है।
  • स्केलिंग : कैश के रूप में आपको एक से अधिक उदाहरण की आवश्यकता होने से पहले दोनों आपको हेडरूम प्रदान करते हैं। रेडिस में उपकरण शामिल हैं जो आपको इससे आगे जाने में मदद करता है जबकि memcached नहीं करता है।

memcached

Memcached एक साधारण अस्थिर कैश सर्वर है। यह आपको कुंजी / मूल्य जोड़े को स्टोर करने की अनुमति देता है जहां मान 1 एमबी तक स्ट्रिंग होने तक सीमित है।

यह इस पर अच्छा है, लेकिन यह सब कुछ करता है। आप उन मूल्यों को अपनी कुंजी से अत्यधिक उच्च गति पर एक्सेस कर सकते हैं, अक्सर उपलब्ध नेटवर्क या स्मृति बैंडविड्थ को संतृप्त करते हैं।

जब आप memcached को पुनरारंभ करते हैं तो आपका डेटा समाप्त हो जाता है। यह एक कैश के लिए ठीक है। आपको वहां कुछ भी महत्वपूर्ण स्टोर नहीं करना चाहिए।

यदि आपको उच्च प्रदर्शन या उच्च उपलब्धता की आवश्यकता है तो वहां तीसरे पक्ष के उपकरण, उत्पाद और सेवाएं उपलब्ध हैं।

redis

Redis समान कार्य कर सकते हैं जैसे memcached कर सकते हैं, और उन्हें बेहतर कर सकते हैं।

रेडिस भी एक कैश के रूप में कार्य कर सकते हैं । यह कुंजी / मूल्य जोड़े भी स्टोर कर सकता है। रेडिस में वे 512 एमबी तक भी हो सकते हैं।

आप दृढ़ता को बंद कर सकते हैं और यह आपके डेटा को फिर से शुरू करने में खुशी से खो देगा। यदि आप अपने कैश को पुनरारंभ करने के लिए चाहते हैं तो यह आपको भी ऐसा करने देता है। वास्तव में, यह डिफ़ॉल्ट है।

यह बहुत तेज है, अक्सर नेटवर्क या मेमोरी बैंडविड्थ द्वारा सीमित है।

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

रेडिस सुपरसैट

रेडिस एक कैश से अधिक है। यह एक मेमोरी डेटा संरचना सर्वर है। नीचे आपको चीजों का त्वरित अवलोकन मिलेगा रेडिस एक सरल कुंजी / मूल्य कैश होने से परे कर सकते हैं जैसे memcached। रेडिस की अधिकांश विशेषताएं ऐसी चीजें हैं जो memcached चीजें नहीं कर सकती हैं।

प्रलेखन

Redis memcached की तुलना में बेहतर दस्तावेज है। हालांकि यह व्यक्तिपरक हो सकता है, यह हर समय अधिक से अधिक सच लगता है।

redis.io एक शानदार आसानी से redis.io संसाधन है। यह आपको ब्राउज़र में रेडिस करने की सुविधा देता है और आपको दस्तावेज़ों में प्रत्येक कमांड के साथ लाइव इंटरैक्टिव उदाहरण भी देता है।

रेडिस के लिए memcached के रूप में अब 2x के रूप में कई stackoverflow परिणाम हैं। 2x के रूप में कई Google परिणाम। अधिक भाषाओं में अधिक आसानी से सुलभ उदाहरण। अधिक सक्रिय विकास। अधिक सक्रिय ग्राहक विकास। इन मापों का अर्थ अलग-अलग नहीं हो सकता है, लेकिन संयोजन में वे एक स्पष्ट तस्वीर पेंट करते हैं जो रेडिस के लिए समर्थन और दस्तावेज़ीकरण अधिक है और बहुत अधिक अद्यतित है।

Persistence

डिफ़ॉल्ट रूप से redis स्नैपशॉटिंग नामक एक तंत्र का उपयोग कर डिस्क पर अपने डेटा को जारी रखता है। यदि आपके पास पर्याप्त रैम उपलब्ध है तो यह आपके सभी डेटा को डिस्क पर लगभग कोई प्रदर्शन गिरावट के साथ लिखने में सक्षम है। यह लगभग मुफ़्त है!

स्नैपशॉट मोड में एक मौका है कि अचानक क्रैश के परिणामस्वरूप खोए गए डेटा की थोड़ी मात्रा हो सकती है। यदि आपको पूरी तरह से यह सुनिश्चित करने की ज़रूरत है कि कोई डेटा कभी खो नहीं गया है, तो चिंता न करें, रेडिस में एओएफ (केवल ऐपेंड फ़ाइल) मोड के साथ आपकी पीठ भी है। इस दृढ़ता मोड डेटा को डिस्क पर सिंक किया जा सकता है जैसा लिखा है। इससे अधिकतम डिस्क थ्रूपुट कम हो सकता है, हालांकि आपकी डिस्क लिख सकती है, लेकिन अभी भी काफी तेज़ होना चाहिए।

यदि आपको आवश्यकता हो तो दृढ़ता से ट्यून करने के लिए कई कॉन्फ़िगरेशन विकल्प हैं, लेकिन डिफ़ॉल्ट बहुत समझदार हैं। ये विकल्प डेटा को स्टोर करने के लिए एक सुरक्षित, अनावश्यक स्थान के रूप में रेडिस को सेट करना आसान बनाता है। यह एक असली डेटाबेस है।

कई डेटा प्रकार

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

स्ट्रिंग्स ( commands )

सरल टेक्स्ट या बाइनरी मान जो आकार में 512 एमबी तक हो सकते हैं। यह एकमात्र डेटा प्रकार रेडिस और मेमकैच शेयर है, हालांकि memcached तार 1 एमबी तक सीमित हैं।

रेडिस आपको बिटटाइज ऑपरेशंस, बिट-स्तरीय हेरफेर, फ़्लोटिंग प्वाइंट वृद्धि / कमी समर्थन, रेंज क्वेरीज और मल्टी-कुंजी ऑपरेशंस के लिए कमांड की पेशकश करके इस डेटाटाइप का लाभ उठाने के लिए और अधिक टूल देता है। Memcached उसमें से किसी का समर्थन नहीं करता है।

स्ट्रिंग्स सभी प्रकार के उपयोग मामलों के लिए उपयोगी हैं, यही कारण है कि memcached अकेले इस डेटा प्रकार के साथ काफी उपयोगी है।

हैश ( commands )

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

हैश नामस्थान के रूप में उपयोगी हैं, या जब आप तर्कसंगत रूप से कई कुंजी समूह बनाना चाहते हैं। एक हैश के साथ आप सभी सदस्यों को कुशलता से पकड़ सकते हैं, सभी सदस्यों को एक साथ समाप्त कर सकते हैं, सभी सदस्यों को एक साथ हटा सकते हैं, आदि। किसी भी उपयोग के मामले के लिए बढ़िया जहां आपके पास कई महत्वपूर्ण / मूल्य जोड़े हैं जिन्हें समूहबद्ध करने की आवश्यकता है।

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

सूची ( commands )

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

रेडिस सूचियों को लीवरेज करने के लिए कई commands प्रदान करता है, जिसमें पुश / पॉप आइटम्स के लिए कमांड, सूचियों के बीच पुश / पॉप, सूचियों की सूची, रेंज क्वेरी आदि शामिल हैं।

सूची महान टिकाऊ, परमाणु, कतार बनाते हैं। यह नौकरी कतार, लॉग, बफर, और कई अन्य उपयोग मामलों के लिए बहुत अच्छा काम करता है।

सेट ( commands )

सेट अद्वितीय मूल्यों के अनियंत्रित संग्रह हैं। उन्हें अनुकूलित करने के लिए अनुकूलित किया जाता है कि कोई मान सेट में है या नहीं, मूल्यों को जल्दी से जोड़ें / हटाएं, और अन्य सेट के साथ ओवरलैप मापने के लिए।

एक्सेस कंट्रोल सूचियों, अद्वितीय विज़िटर ट्रैकर्स और कई अन्य चीजों जैसी चीजों के लिए ये बहुत अच्छे हैं। अधिकांश प्रोग्रामिंग भाषाओं में कुछ समान होता है (आमतौर पर सेट कहा जाता है)। यह ऐसा ही है, केवल वितरित किया गया है।

Redis सेट प्रबंधित करने के लिए कई commands प्रदान करता है। सेट जोड़ने, हटाने और जांच करने जैसे स्पष्ट लोग मौजूद हैं। ऐसे में कम स्पष्ट आदेश हैं जैसे एक यादृच्छिक आइटम पॉपिंग / पढ़ना और अन्य सेटों के साथ यूनियनों और चौराहे करने के लिए आदेश।

क्रमबद्ध समूह ( commands )

सॉर्ट किए गए सेट अद्वितीय मानों का संग्रह भी हैं। ये नाम, जैसा कि नाम का तात्पर्य है, आदेश दिया जाता है। उन्हें एक स्कोर द्वारा आदेश दिया जाता है, फिर लेक्सिकोोग्राफिक रूप से।

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

यदि आप अपने उच्च स्कोर के साथ सॉर्ट किए गए सेट में उपयोगकर्ताओं को जोड़ते हैं, तो आपके पास स्वयं एक आदर्श लीडर-बोर्ड है। जैसे-जैसे नए उच्च स्कोर आते हैं, बस उन्हें अपने उच्च स्कोर के साथ सेट में जोड़ें और यह आपके लीडर-बोर्ड को फिर से ऑर्डर करेगा। आखिरी बार उपयोगकर्ताओं का दौरा करने और आपके आवेदन में सक्रिय कौन सा ट्रैक रखने के लिए भी बढ़िया है।

एक ही स्कोर के साथ मूल्यों को संग्रहित करने से उन्हें लेक्सिकोोग्राफ़िक रूप से आदेश दिया जा सकता है (वर्णानुक्रम में सोचें)। यह ऑटो-पूर्ण सुविधाओं जैसी चीजों के लिए उपयोगी हो सकता है।

सॉर्ट किए गए सेट commands में से कई सेट के लिए commands समान होते हैं, कभी-कभी अतिरिक्त स्कोर पैरामीटर के साथ। अंक के प्रबंधन और स्कोर द्वारा पूछताछ के लिए कमांड भी शामिल हैं।

भू

रेडिस में भौगोलिक डेटा को संग्रहीत करने, पुनर्प्राप्त करने और मापने के लिए कई commands । इसमें त्रिज्या प्रश्न और अंक के बीच दूरी को मापना शामिल है।

रेडिस में तकनीकी रूप से भौगोलिक डेटा क्रमबद्ध सेट के भीतर संग्रहीत किया जाता है, इसलिए यह वास्तव में अलग डेटा प्रकार नहीं है। यह क्रमबद्ध सेट के शीर्ष पर एक विस्तार का अधिक है।

बिटमैप और हाइपरलोग्लॉग

भौगोलिक की तरह, ये पूरी तरह अलग डेटा प्रकार नहीं हैं। ये वे आदेश हैं जो आपको स्ट्रिंग डेटा का इलाज करने की अनुमति देते हैं जैसे कि यह या तो बिटमैप या हाइपरब्लॉग है।

बिटमैप्स Strings तहत संदर्भित बिट-स्तरीय ऑपरेटरों के लिए हैं। यह डेटा प्रकार Reddit की हाल ही में सहयोगी कला प्रोजेक्ट के लिए मूल बिल्डिंग ब्लॉक था: r/Place

हाइपरलोग्लॉग आपको चौंकाने वाली सटीकता के साथ लगभग असीमित अद्वितीय मानों की गणना करने के लिए निरंतर बहुत कम मात्रा में स्थान का उपयोग करने की अनुमति देता है। केवल ~ 16 केबी का उपयोग करके आप अपनी साइट पर अद्वितीय विज़िटर की संख्या को कुशलता से गिन सकते हैं, भले ही वह संख्या लाखों में हो।

लेनदेन और परमाणुता

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

रिलेशनल डेटाबेस में लेनदेन के समान नहीं होने पर, रेडिज़ में transactions भी होते हैं जो "आशावादी लॉकिंग" ( WATCH / MULTI / EXEC ) का उपयोग करते हैं।

पाइपलाइनिंग

रेडिस ' pipelining ' नामक एक सुविधा प्रदान करता है। यदि आपके पास कई रेडिस कमांड हैं जिन्हें आप निष्पादित करना चाहते हैं तो आप पाइपलाइनिंग का उपयोग एक-एक-बार के बजाय एक बार फिर से रेडिस भेजने के लिए कर सकते हैं।

आम तौर पर जब आप या तो redis या memcached को कमांड निष्पादित करते हैं, तो प्रत्येक कमांड एक अलग अनुरोध / प्रतिक्रिया चक्र होता है। पाइपलाइनिंग के साथ, रेडिस कई आदेशों को बफर कर सकता है और उन्हें एक ही समय में निष्पादित कर सकता है, एक ही जवाब में आपके सभी आदेशों के सभी प्रतिक्रियाओं का जवाब दे सकता है।

यह आपको थोक आयात या अन्य कार्रवाइयों पर भी अधिक थ्रूपुट प्राप्त करने की अनुमति दे सकता है जिसमें बहुत से आदेश शामिल हैं।

पब / उप

रेडिस में पब / उप कार्यक्षमता को समर्पित commands , जिससे रेडिस को हाई स्पीड मैसेज ब्रॉडकास्टर के रूप में कार्य करने की इजाजत मिलती है। यह एक एकल क्लाइंट को चैनल से जुड़े कई अन्य ग्राहकों को संदेश प्रकाशित करने की अनुमति देता है।

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

लुआ स्क्रिप्टिंग

आप लालसा के स्वयं के एसक्यूएल या संग्रहीत प्रक्रियाओं जैसे लुआ स्क्रिप्ट्स के बारे में सोच सकते हैं। यह उससे अधिक और कम दोनों है, लेकिन समानता ज्यादातर काम करता है।

हो सकता है कि आपके पास जटिल गणनाएं हों जो आप लालसा करना चाहते हैं। हो सकता है कि आप अपने लेनदेन को वापस ले सकें और जटिल प्रक्रिया के प्रत्येक चरण की गारंटी की आवश्यकता हो, परमाणु रूप से होगा। लुआ स्क्रिप्टिंग के साथ इन समस्याओं और कई और हल किए जा सकते हैं।

पूरी स्क्रिप्ट को परमाणु रूप से निष्पादित किया जाता है, इसलिए यदि आप अपने तर्क को लुआ लिपि में फिट कर सकते हैं तो आप अक्सर आशावादी लॉकिंग लेनदेन के साथ गड़बड़ से बच सकते हैं।

स्केलिंग

जैसा ऊपर बताया गया है, रेडिस में क्लस्टरिंग के लिए समर्थन में बनाया गया है और इसे redis-sentinel नामक अपने उच्च उपलब्धता उपकरण के साथ बंडल किया गया है।

निष्कर्ष

बिना किसी हिचकिचाहट के मैं किसी भी नई परियोजनाओं, या मौजूदा परियोजनाओं के लिए memcached पर redis की सिफारिश करेंगे जो पहले से ही memcached का उपयोग नहीं करते हैं।

उपरोक्त ध्वनि लग सकता है जैसे मुझे memcached पसंद नहीं है। इसके विपरीत: यह एक शक्तिशाली, सरल, स्थिर, परिपक्व और कठोर उपकरण है। यहां तक ​​कि कुछ उपयोग के मामले भी हैं जहां यह रेडिस की तुलना में थोड़ा तेज है। मुझे memcached प्यार करता हूँ। मुझे नहीं लगता कि यह भविष्य के विकास के लिए ज्यादा समझ में आता है।

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

केवल एक परिदृश्य है जहां memcached अधिक समझ में आता है: जहां कैश के रूप में memcached पहले से उपयोग में है। यदि आप पहले से ही memcached के साथ कैशिंग कर रहे हैं तो इसे उपयोग करते रहें, अगर यह आपकी आवश्यकताओं को पूरा करता है। यह रेडिस में जाने के प्रयास के लायक नहीं है और यदि आप केवल कैशिंग के लिए रेडिस का उपयोग करने जा रहे हैं तो यह आपके समय के लायक होने के लिए पर्याप्त लाभ प्रदान नहीं कर सकता है। यदि memcached आपकी आवश्यकताओं को पूरा नहीं कर रहा है, तो आपको शायद redis में जाना चाहिए। यह सच है कि आपको memcached से परे स्केल करने की आवश्यकता है या आपको अतिरिक्त कार्यक्षमता की आवश्यकता है।

हम कैशिंग के लिए Redis सर्वर के साथ एक रूबी वेब-ऐप का उपयोग कर रहे हैं। क्या इसके बजाय Memcached का परीक्षण करने का कोई मुद्दा है?

हमें बेहतर प्रदर्शन क्या देगा? रेडिस और मेमकैच के बीच कोई भी पेशेवर या विपक्ष?

घ्यान देने योग्य बातें:

  • पढ़ें / लिखो गति।
  • स्मृति उपयोग।
  • डिस्क I / O डंपिंग।
  • स्केलिंग।

Memcached multithreaded और तेजी से है।

रेडिस में बहुत सी विशेषताएं हैं और बहुत तेज है, लेकिन एक कोर तक पूरी तरह से सीमित है क्योंकि यह एक ईवेंट लूप पर आधारित है।

हम दोनों का उपयोग करते हैं। मेमकैच का उपयोग कैशिंग ऑब्जेक्ट्स के लिए किया जाता है, मुख्य रूप से डेटाबेस पर पढ़ने के भार को कम करता है। रेडिस का उपयोग सॉर्ट किए गए सेट जैसी चीजों के लिए किया जाता है जो समय-श्रृंखला डेटा को रोल करने के लिए आसान होते हैं।


Redis-2.2.2 और memcached के खिलाफ 100k अद्वितीय कुंजी और मान सेट करने और प्राप्त करने के लिए एक बहुत ही सरल परीक्षण। दोनों लिनक्स वीएम (सेंटोस) पर चल रहे हैं और मेरे क्लाइंट कोड (नीचे चिपकाया गया) विंडोज डेस्कटॉप पर चलता है।

Redis

  • 100000 मूल्यों को स्टोर करने के लिए लिया गया समय = 18 9 4 9एमएस है

  • 100000 मूल्यों को लोड करने के लिए लिया गया समय = 18328ms है

memcached

  • 100000 मूल्यों को स्टोर करने के लिए लिया गया समय = 797 एमएमएस है

  • 100000 मूल्यों को पुनः प्राप्त करने के लिए लिया गया समय = 38 9 8 मिमी है

Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

एक और बोनस यह है कि यह बहुत स्पष्ट हो सकता है कि कैसे कैशिंग परिदृश्य में मेमकेच व्यवहार करने जा रहा है, जबकि रेडिस को आम तौर पर लगातार डेटास्टोर के रूप में उपयोग किया जाता है, हालांकि इसे अधिकतम मेक्केड उर्फ ​​की तरह व्यवहार करने के लिए कॉन्फ़िगर किया जा सकता है जब यह अधिकतम पहुंचता है क्षमता।

कुछ ऐप्स जो मैंने उपयोग करने के लिए काम किया है, यह स्पष्ट करने के लिए कि हम डेटा को कैसे व्यवहार करना चाहते हैं - मेमकेचे में सामान, हम उन मामलों को संभालने के लिए कोड लिखते हैं जहां यह नहीं है - रेडिस में सामान, हम उस पर भरोसा करते हैं ।

इसके अलावा रेडिस को आमतौर पर अधिकतर उपयोग किए जाने वाले मामलों के लिए बेहतर माना जाता है और अधिक सुविधा युक्त और इस प्रकार लचीला होता है।


परीक्षा। कुछ सरल मानक चलाएं। लंबे समय तक मैंने खुद को एक पुराना स्कूल गैंडो माना क्योंकि मैंने ज्यादातर मेमकैच किया था और रेडिस को नया बच्चा माना जाता था।

मेरी वर्तमान कंपनी रेडिस के साथ मुख्य कैश के रूप में इस्तेमाल किया गया था। जब मैंने कुछ प्रदर्शन आंकड़ों में खोला और परीक्षण शुरू किया, तो रेडिस प्रदर्शन के संदर्भ में, तुलनात्मक या न्यूनतम रूप से MySQL की तुलना में धीमी थी।

यादगार, हालांकि सरलीकृत, पूरी तरह से पानी से बाहर Redis blew। यह बहुत बेहतर स्केल किया गया:

  • बड़े मूल्यों के लिए (स्लैब आकार में आवश्यक परिवर्तन, लेकिन काम किया)
  • एकाधिक समवर्ती अनुरोधों के लिए

साथ ही, memcached निष्कासन नीति मेरे विचार में है, बहुत बेहतर कार्यान्वित किया गया है, जिसके परिणामस्वरूप कैश की तुलना में अधिक डेटा संभालने के दौरान समग्र रूप से अधिक स्थिर औसत प्रतिक्रिया समय होता है।

कुछ बेंचमार्किंग से पता चला कि रेडिस, हमारे मामले में, बहुत खराब प्रदर्शन करता है। मुझे विश्वास है कि कई चर के साथ क्या करना है:

  • आप जिस हार्डवेयर को रेडिस चलाते हैं उसका प्रकार
  • आपके द्वारा संग्रहीत डेटा के प्रकार
  • हो जाता है और सेट की मात्रा
  • आपका ऐप कितना समवर्ती है
  • क्या आपको डेटा संरचना भंडारण की आवश्यकता है

निजी तौर पर, मैं रेडिस लेखकों के समेकन और बहुप्रचार पर विचार साझा नहीं करता हूं।


मुझे कैशिंग प्रॉक्सी में एक साथ memcached और redis दोनों का उपयोग करने का मौका मिला है, जिस पर मैंने काम किया है, मुझे आपको साझा करने दें जहां मैंने वास्तव में उपयोग किया है और पीछे क्या कारण है ....

रेडिस>

1) क्लस्टर पर कैश सामग्री को अनुक्रमणित करने के लिए प्रयुक्त होता है। रेडिस क्लस्टर पर फैले अरबों से अधिक चाबियाँ हैं, रेडिस प्रतिक्रिया समय काफी कम और स्थिर है।

2) असल में, यह एक कुंजी / मूल्य स्टोर है, इसलिए जहां आपके पास कभी भी एप्लिकेशन में कुछ समान होता है, कोई भी परेशानियों के साथ रेडिस का उपयोग कर सकता है।

3) रेडिस दृढ़ता, फेलओवर और बैकअप (एओएफ) आपके काम को आसान बना देगा।

Memcache>

1) हां, एक अनुकूलित स्मृति जिसे कैश के रूप में उपयोग किया जा सकता है। मैंने 1 एमबी से कम आकार के साथ बहुत बार (50 हिट / सेकेंड के साथ) कैश सामग्री को संग्रहीत करने के लिए इसका इस्तेमाल किया।

2) मैंने 16 जीबी में से केवल 2 जीबी को मेमकैच के लिए आवंटित किया था, तब भी जब मेरा एकल सामग्री आकार> 1 एमबी था।

3) चूंकि सामग्री सीमाओं के करीब बढ़ती है, कभी-कभी मैंने आंकड़ों में उच्च प्रतिक्रिया समय देखा है (रेडिस के मामले में नहीं)।

यदि आप समग्र अनुभव के लिए पूछते हैं तो रेडिस बहुत हरा है क्योंकि इसे कॉन्फ़िगर करना आसान है, स्थिर मजबूत सुविधाओं के साथ बहुत लचीला है।

इसके अलावा, इस link पर एक बेंचमार्किंग परिणाम उपलब्ध है, नीचे से कुछ higlight हैं,

उम्मीद है की यह मदद करेगा!!


यदि Redis का प्रयोग करें

  1. आपको कैश में चुनिंदा रूप से हटाने / समाप्त करने की आवश्यकता होती है। (आपको इसकी आवश्यकता है)

  2. आपको किसी विशेष प्रकार की कुंजी की क्वेरी करने की क्षमता की आवश्यकता होती है। eq। 'ब्लॉग 1: पोस्ट: *', 'ब्लॉग 2: श्रेणियां: xyz: पद: *'। अरे हां! यह बहुत महत्वपूर्ण है। कुछ प्रकार के कैश किए गए आइटम को चुनिंदा रूप से अमान्य करने के लिए इसका उपयोग करें। आप इसका उपयोग खंड कैश, पेज कैश, किसी दिए गए प्रकार की केवल एआर ऑब्जेक्ट्स को अमान्य करने के लिए भी कर सकते हैं।

  3. दृढ़ता (आपको इसकी भी आवश्यकता होगी, जब तक कि आप अपने कैश के साथ हर पुनरारंभ करने के बाद गर्म होने के ठीक न हों। ऑब्जेक्ट्स के लिए बहुत जरूरी है जो शायद ही कभी बदलते हैं)

अगर memcached का प्रयोग करें

  1. Memcached आपको सिरदर्द देता है!
  2. उम ... क्लस्टरिंग? हुंह। यदि आप अब तक जा रहे हैं, तो टुकड़ों और एआर ऑब्जेक्ट्स को कैशिंग के लिए वार्निश और रेडिस का उपयोग करें।

मेरे अनुभव से मैंने मेमकैड की तुलना में रेडिस के साथ बहुत बेहतर स्थिरता प्राप्त की है


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

और कुछ बेंचमार्क लिंक चीजों को भ्रमित किए बिना पूरा नहीं हुआ है, इसलिए डॉर्मोंडो के लाइवजर्नल और एंटीरेज़ वेबलॉग में कुछ विवादित बेंचमार्क भी देखें।

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


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


रेडिस बेहतर है रेडिस के पेशेवर हैं,

1.It has a lot of data storage options such  as  string  , sets , sorted sets ,  hashes ,  bitmaps
2.Disk Persistence of records 
3.Stored Procedure (LUA acripting)  support
4.Can act as a Message Broker using PUB/SUB

जबकि Memcache एक इन-मेमोरी कुंजी मान कैश प्रकार प्रणाली है।

  1. सूचियों जैसे विभिन्न डेटा प्रकार स्टोरेज के लिए कोई समर्थन नहीं, रेडिस के रूप में सेट करता है।
  2. मुख्य बात यह है कि मेमकेचे में कोई डिस्क दृढ़ता नहीं है।

हमने रेडिस को काम पर हमारी परियोजना के लिए लोड-टेकऑफ के रूप में सोचा था। हमने सोचा कि Nginx में मॉड्यूल का उपयोग करके HttpRedis2Module या कुछ समान है, तो हम बहुत ही तेज गति प्राप्त करेंगे लेकिन एबी-टेस्ट के साथ परीक्षण करते समय हम गलत साबित होते हैं।

हो सकता है कि मॉड्यूल खराब था या हमारा लेआउट था लेकिन यह एक बहुत ही आसान काम था और यह php के साथ डेटा लेने के लिए और तेज़ था और फिर इसे मोंगोडीबी में रखता था। हम एपीसी का उपयोग कैशिंग सिस्टम के रूप में कर रहे हैं और उस PHP और MongoDB के साथ। यह nginx Redis मॉड्यूल के बाद बहुत तेज था।

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


पहले से ही स्वीकृत उत्तर पर टिप्पणी के रूप में पोस्ट करने के लिए बहुत लंबा है, इसलिए मैंने इसे एक अलग उत्तर के रूप में रखा है

एक बात यह भी विचार करने के लिए है कि क्या आप अपने कैश उदाहरण पर हार्ड अपर मेमोरी सीमा की अपेक्षा करते हैं।

चूंकि रेडिस एक एनओएसक्ल डेटाबेस है जिसमें कई फीचर्स हैं और कैशिंग केवल एक विकल्प है जिसका उपयोग किया जा सकता है, यह स्मृति को आवंटित करता है क्योंकि इसकी आवश्यकता होती है - जितनी अधिक वस्तुएं आप इसमें डालते हैं, उतनी ही मेमोरी इसका उपयोग करती है। maxmemory विकल्प सख्ती से ऊपरी स्मृति सीमा उपयोग लागू नहीं करता है। जैसे ही आप कैश के साथ काम करते हैं, चाबियाँ निकाल दी जाती हैं और समाप्त हो जाती हैं; संभावना है कि आपकी चाबियाँ एक ही आकार में नहीं हैं, इसलिए आंतरिक मेमोरी विखंडन होता है।

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

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

इसके साथ ही, memcached अभी भी वातावरण में एक मजबूत स्थिति है, जहां स्मृति उपयोग लागू किया जाना चाहिए और / या अनुमानित होना चाहिए। हमने 10-15k सेशन / एस के वर्कलोड में एक ड्रॉप-इन गैर-लगातार एलआरयू-आधारित मेमकैच प्रतिस्थापन के रूप में नवीनतम स्थिर रेडिस (2.8.1 9) का उपयोग करने का प्रयास किया है, और यह स्मृति को बहुत कम कर देता है; एक ही वर्कलोड उसी कारण से अमेज़ॅन के एलिस्टी कैश रेडिस उदाहरणों को एक दिन या तो दुर्घटनाग्रस्त कर रहा था।





redis