Redis और Memcache या सिर्फ Redis?


85

मैं सरल के माध्यम से अपने रेल 3 ऐप में कुछ कैशिंग के लिए मेमकाटेड का उपयोग कर रहा हूं Rails.cache इंटरफ़ेस के और अब मैं कुछ पृष्ठभूमि जॉब प्रसंस्करण को रेडिस और रेसक्यू के साथ करना चाहता हूं।

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

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

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


5
इस पर विचार करने वाले किसी और के लिए: रेल के लिए एक रेडिस-स्टोर प्लगइन है जो आपको कैश स्टोर के रूप में रेडिस का उपयोग करने की अनुमति देता है।
मार्कक्वेजडा

जवाबों:


49

यह मानते हुए कि आपके द्वारा पहले से की गई कैशिंग के लिए मेमेकैच्ड से रेडिस की ओर पलायन आसान है, मैं चीजों को सरल रखने के लिए केवल रेडिस के साथ जाऊंगा।

रेडिस में दृढ़ता वैकल्पिक है, इसलिए यदि आप चाहते हैं तो आप इसे मेमेकैच्ड की तरह उपयोग कर सकते हैं। आपको यह भी पता चल सकता है कि पुनरारंभ होने के बाद बहुत सारे कैश मिस से बचने के लिए अपने कैश को लगातार बनाए रखना उपयोगी है। एक्सपायरी भी उपलब्ध है - एल्गोरिथ्म मेम्केड से थोड़ा अलग है, लेकिन अधिकांश उद्देश्यों के लिए पर्याप्त नहीं है - विवरण के लिए http://redis.io/commands/expire देखें।


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

1
यदि आप कुछ वस्तुओं को अल्पकालिक (टुकड़ा कैशिंग) और कुछ वस्तुओं को लाल रंग में रखना चाहते हैं, तो क्या आपको दो अलग-अलग रेडिस इंस्टेंसेस बनाने की आवश्यकता है?
ब्रायन आर्मस्ट्रांग

1
जब हम Redis का उपयोग दोनों नौकरियों की कतारों और कैश के लिए करते हैं, तो हम उन्हें विशेष रूप से @BrianArmstrong राज्यों के कारणों के लिए अलग-अलग कॉन्फ़िगरेशन के साथ चलाते हैं। कैश अल्पकालिक है इसलिए हम इसे तेज होने के साथ कॉन्फ़िगर करते हैं, लेकिन मेमोरी में चीजों को खोना और LRU को छोड़ना ठीक है। कतार के लिए, हम वास्तव में नौकरियों को खोना नहीं चाहते हैं इसलिए हम इसे दृढ़ता के साथ कॉन्फ़िगर करते हैं ताकि यह पुनर्प्राप्त करने योग्य हो।
23

@jwadsack क्या आपके पास एक पोस्ट है जहां आप दिखाते हैं कि आपने इस कॉन्फ़िगरेशन को कैसे लागू किया?
मार्कर

1
@ मार्कर अच्छा विचार है। अब मैं करता हूं: Ballardhack.wordpress.com/2015/09/30/…
jwadsack

44

मैं रेडिस-स्टोर का लेखक हूं , सीधे रेडिस कमांड का उपयोग करने की आवश्यकता नहीं है, बस :expires_inइस तरह के विकल्प का उपयोग करें:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

रेडिस का उपयोग करने का लाभ तेजी है, और मेरे मणि के साथ, यह है कि आपके पास पहले से ही स्टोर हैं Rack::Cache, Rails.cacheया I18n


प्रतिक्रिया के लिए धन्यवाद लुका। मैं मान रहा हूँ कि आप ओवरराइड कर सकते हैं: expire_in सीधे जब आपको लगातार कुछ स्टोर करने की आवश्यकता होती है? मुझे लगता है कि सवाल वास्तव में दोनों प्रकार की कार्यक्षमता का उपयोग करने और एक दूसरे के साथ लगातार स्टोर के रूप में रेडिस का उपयोग करने के बारे में है।
मार्कक्वेजडा

3
मुझे नहीं लगता कि यह दोनों के साथ-साथ और Nois सेगमेंट में होने के बाद भी दोनों के बीच में कोई समझौता नहीं है। Redis PROS: 1. मेमकेड से तेज़। 2. अधिक शक्तिशाली कमांड। कोई कैश वार्मअप की आवश्यकता नहीं है। 4. अन्य समस्याओं को हल करने के लिए उपयोगी (जैसे कि Resque के साथ कतारों) CONS: 1. आपको एक बाहरी रत्न की आवश्यकता है 2. पुनः आरंभ करने के बाद, सर्वर एपेंड फ़ाइल से डेटा पढ़ते समय आदेशों को स्वीकार नहीं करता है मेमोकैडेड प्रोस: बेक इन रेल्स कॉन्स: 1. रेडिस की तुलना में धीमा 2. कैश वार्मअप।
लुका गाइडी

3
@LucaGuidi मैं वर्तमान में अपने रेल कैश के लिए RedisStore का उपयोग कर रहा हूं। मैं यह पता नहीं लगा सकता कि रेडिस URL और डिफ़ॉल्ट दोनों को कैसे सेट किया जाए :expires_in। क्या आप मदद कर सकते हैं?
क्रिस विंसेंट

मेरी तरह, यदि आप :expires_inredis_store refer stackoverflow.com/questions/20907247/…
अनिरुद्धन J

19

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

अधिक जानकारी:

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

redis: आप इसे डेटा के लिए उपयोग करते हैं जिसे आप खोना नहीं चाहते हैं, और यह मेमोरी में फिट होने के लिए काफी छोटा है। इसमें आमतौर पर रेसक्यू / साइडकीक जॉब्स, रेट लिमिटिंग के लिए काउंटर्स, स्प्लिट टेस्ट रिजल्ट्स, या ऐसी कोई भी चीज शामिल होती है, जिसे आप खोना या दोबारा बनाना नहीं चाहते। आप यहां मेमोरी सीमा को पार नहीं करना चाहते हैं, इसलिए आपको जो आप स्टोर करते हैं और बाद में सफाई करते हैं, उसके बारे में थोड़ा अधिक सावधान रहना होगा।

एक बार इसकी मेमोरी लिमिट से अधिक हो जाने पर रेडिस को परफॉरमेंस की समस्या होने लगती है (यदि मैं गलत हूँ तो मुझे सही करें)। रेडिस को मेमकाटेड और LRU एक्सपायर सामान की तरह काम करने के लिए कॉन्फ़िगर करके इसे हल करना संभव है, इसलिए यह कभी भी अपनी मेमोरी सीमा तक नहीं पहुंचता है। लेकिन आप ऐसा कुछ भी नहीं करना चाहेंगे जो आप रेडिस में रख रहे हैं, जैसे कि रेसक्यू जॉब। इसलिए लोगों के बजाय अक्सर डिफ़ॉल्ट रखते हैं, Rails.cache Memcached ( dalliरत्न का उपयोग करके ) का उपयोग करने के लिए सेट किया गया है । और फिर वे एक अलग $ redis रखते हैं ... ... redis संचालन करने के लिए वैश्विक चर।

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

Redis में यह सब करने का एक आसान तरीका हो सकता है - शायद दो अलग-अलग Redis इंस्टेंस होने से, एक LRU हार्ड मेमोरी लिमिट के साथ, एक Memcache के समान, और दूसरा लगातार स्टोरेज के लिए? मैंने इसे इस्तेमाल नहीं किया है, लेकिन मुझे लगता है कि यह उचित होगा।


15

मैं इस विषय पर अपने उत्तर की जाँच करने पर विचार करूंगा:

रेल और कैशिंग, क्या मेमेचे और रेडिस के बीच स्विच करना आसान है?

अनिवार्य रूप से, अपने अनुभव के माध्यम से, मैं उन्हें अलग रखने की वकालत करूंगा: डेटा संरचनाओं और अधिक स्थायी भंडारण के लिए कैशिंग और रेडिस के लिए मेमेकैस्टेड


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

6

मैंने रेडिस लैब्स (जो मेम्केच्ड क्लाउड और रेडिस क्लाउड ऐड ऑन प्रदान करता है) की टीम से पूछा कि वे किस उत्पाद के लिए रेल कैशिंग की सिफारिश करेंगे। उन्होंने कहा कि सामान्य तौर पर वे रेडिस क्लाउड की सिफारिश करेंगे, कि मेम्केच्ड क्लाउड मुख्य रूप से विरासत उद्देश्यों के लिए पेश किया जाता है, और बताया कि उनकी मेम्केड क्लाउड सेवा वास्तव में रेडिस क्लाउड के शीर्ष पर निर्मित है।


तो ब्रायन के उत्तर में उल्लिखित दोनों मेमेकेड और रेडिस की कोई आवश्यकता नहीं है? "लोग अक्सर डिफ़ॉल्ट Rails.cache सेट को मेमेकैड (डल्ली रत्न का उपयोग करने के लिए) का उपयोग करने के लिए रखते हैं। और फिर वे एक अलग $ redis = ... वैश्विक चर रेडिस संचालन करने के लिए रखते हैं।"
मार्कलर

4

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


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

मल्टी-थ्रेडिंग के साथ मेमेक के
लेज़र स्प्रेनकर

3
रेडिस की यह बड़ी कमी वाकई बहुत खलती है। यदि आप उच्च-संगामिति की तलाश में हैं और आपके पास कई कोर हैं, तो Memcached Redis के चारों ओर सर्कल चला सकता है। साझा करना एक अच्छा समाधान नहीं है क्योंकि आपको अपने आवेदन में सुसंगत हैशिंग को लागू करना होगा और आपको रेडिस उदाहरणों के बीच सही वितरण नहीं मिलेगा। उदाहरण के लिए यदि शार्क ए आपके एप्लिकेशन के कॉन्फिगर को कैश करता है जो कि हर अनुरोध में उपयोग किया जाता है, तो शार्क ए को अन्य शार्क की तुलना में अधिक अनुरोध प्राप्त होंगे जो हर अनुरोध के लिए हिट नहीं होते हैं।
कॉलिनम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.