2011-12-28 19 views
27

मैं पूरी तरह से बंद हो सकता था, लेकिन दृढ़ता सुविधाओं को जोड़ने से पहले कैसे कैश स्टोर काम करने के लिए उपयोग किया जाता था, मेरी समझ यह है कि आइटम उनके टीटीएल के आधार पर समाप्त हो जाएंगे। और यदि स्टोर उपलब्ध रैम को भरना शुरू कर दिया, तो वे स्टोर में कम से कम "महत्वपूर्ण" कुंजी समाप्त करने के लिए उनके एल्गोरिदम होंगे।रैम भरने शुरू होने पर रेडिस कैसे काम करता है?

अब मैंने पढ़ा है कि रेडिस की दृढ़ता विशेषताएं हैं। लेकिन आप उन्हें बंद कर सकते हैं। मान लीजिए कि आप दृढ़ता को बंद कर देते हैं, जब राम भर जाता है तो क्या होता है? रेडिस कैसे तय करता है कि क्या समाप्त हो सकता है?

मुझे टीटीएल के बिना बहुत सारे डेटा होने की उम्मीद है और यह सुनिश्चित करना है कि रेडिस को समाप्त होने के बारे में पता चलाना सुरक्षित है।

उत्तर

35

मुझे नहीं लगता कि सवाल आभासी स्मृति प्रबंधन से संबंधित है, लेकिन Redis में आइटम की समाप्ति है, जो एक पूरी तरह से अलग विषय है के बारे में अधिक।

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

सामान्य नीति maxmemory और maxmemory-नीति पैरामीटर के साथ विन्यास फाइल में चयनित किया जाना चाहिए, नीचे वर्णित:

# Don't use more memory than the specified amount of bytes. 
# When the memory limit is reached Redis will try to remove keys with an 
# EXPIRE set. It will try to start freeing keys that are going to expire 
# in little time and preserve keys with a longer time to live. 
# Redis will also try to remove objects from free lists if possible. 
# 
# If all this fails, Redis will start to reply with errors to commands 
# that will use more memory, like SET, LPUSH, and so on, and will continue 
# to reply to most read-only commands like GET. 
# 
# WARNING: maxmemory can be a good idea mainly if you want to use Redis as a 
# 'state' server or cache, not as a real DB. When Redis is used as a real 
# database the memory usage will grow over the weeks, it will be obvious if 
# it is going to use too much memory in the long run, and you'll have the time 
# to upgrade. With maxmemory after the limit is reached you'll start to get 
# errors for write operations, and this may even lead to DB inconsistency. 
# 
maxmemory <bytes> 

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory 
# is reached? You can select among five behavior: 
# 
# volatile-lru -> remove the key with an expire set using an LRU algorithm 
# allkeys-lru -> remove any key accordingly to the LRU algorithm 
# volatile-random -> remove a random key with an expire set 
# allkeys->random -> remove a random key, any key 
# volatile-ttl -> remove the key with the nearest expire time (minor TTL) 
# noeviction -> don't expire at all, just return an error on write operations 
# 
# Note: with all the kind of policies, Redis will return an error on write 
#  operations, when there are not suitable keys for eviction. 
# 
#  At the date of writing this commands are: set setnx setex append 
#  incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd 
#  sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby 
#  zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby 
#  getset mset msetnx exec sort 
# 
# The default is: 
# 
maxmemory-policy volatile-lru 

# LRU and minimal TTL algorithms are not precise algorithms but approximated 
# algorithms (in order to save memory), so you can select as well the sample 
# size to check. For instance for default Redis will check three keys and 
# pick the one that was used less recently, you can change the sample size 
# using the following configuration directive. 
# 
maxmemory-samples 3 

फिर अलग-अलग आइटम समाप्ति निम्न कमांड का प्रयोग किया जा सकता है: EXPIRE EXPIREAT प्रति आइटम समाप्ति संपत्ति अस्थिर- * नीतियों के साथ उपयोगी है। PERSIST का उपयोग करके समाप्ति भी हटा दी जा सकती है।

समाप्ति संपत्ति थोड़ी मेमोरी ओवरहेड जोड़ती है, इसलिए इसका उपयोग केवल तभी किया जाना चाहिए जब आवश्यक हो।

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

+0

उत्कृष्ट, धन्यवाद। तो defaul एलआरयू एल्गोरिदम ठीक वही है जो मैं चाहता था। बस इसे सेट करने की आवश्यकता है ताकि यह एक 'राज्य' सर्वर हो। – joedevon

2

कृपया रेडिस दस्तावेज से Virtual Memory अध्याय पढ़ें। प्रासंगिक हिस्सा:

VM-अधिकतम स्मृति VM-अधिकतम स्मृति सेटिंग सेटिंग निर्दिष्ट कितनी स्मृति Redis डिस्क पर गमागमन मूल्यों शुरू करने से पहले उपयोग करने के लिए स्वतंत्र है।

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

स्वैप किए गए ऑब्जेक्ट मुख्य रूप से उच्चतम "आयु" वाले होते हैं (यानी, सेकेंड की संख्या का उपयोग नहीं किया जाता है), लेकिन किसी ऑब्जेक्ट की "स्वैपबिलिटी" इसके आकार के लॉगेरिथम के समान होती है याद में। इसलिए हालांकि पुरानी वस्तुओं को प्राथमिकता दी जाती है, लेकिन जब वे एक ही उम्र के होते हैं तो बड़ी वस्तुओं को पहले ही बदल दिया जाता है।

चेतावनी: क्योंकि कुंजी को स्वैप नहीं किया जा सकता है, तो रेडिस वीएम-मैक्स-मेमोरी सेटिंग का सम्मान करने में सक्षम नहीं होंगे अगर अकेले चाबियां सीमा से अधिक जगह का उपयोग कर रही हैं।

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

अद्यतन Redis 2.4 का सवाल है (ऐसा लगता है Redis साइट में आधिकारिक दस्तावेज की तरह है कि संस्करण से अपडेट नहीं किया गया है), यह वीएम उपयोग करने के लिए सिफारिश नहीं की है।

redis.conf का कहना है:

### WARNING! Virtual Memory is deprecated in Redis 2.4 
### The use of Virtual Memory is strongly discouraged. 
+0

चूंकि वर्चुअल मेमोरी को बहिष्कृत किया गया है, तो राम स्मृति सीमा पर होने पर डिस्क मेमोरी का उपयोग करने का सबसे अच्छा तरीका क्या है? – harsimranb

+1

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

2

या तो टीटीएल सेट करें (और रेडिस को आपके लिए समाप्ति को संभालने दें) या अपने आइटम को अपने बुजुर्ग डेटा के साथ पोस्ट करें, शायद जेएसईटीटी (टाइमस्टैम्प, की) टुपल्स के रूप में संग्रहीत किया गया है, जिससे आप अपना कैश सफाई कर सकते हैं आपकी अपनी जरूरतें

8

डिडिएर यह इंगित करने में सही है कि यह कैसे किया जाना है। बस कुछ अतिरिक्त तत्वों (अपने पद से हटाया जा रहा है, जिनमें से एक) का संकेत:

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

maxmemory-नमूने 10

यह नमूनों की संख्या कि Redis लेने के लिए और उसके बाद निकाल देंगे है:

  • कुंजी को हटाने के लिए LRU का उपयोग करते समय निम्न सेटिंग सेट करने के लिए महत्वपूर्ण है इनमें से एलआरयू कुंजी। डिफ़ॉल्ट मान 3 है लेकिन सभी व्यावहारिक उद्देश्यों के लिए यह बहुत कम है - और इसका मतलब यह हो सकता है कि पुरानी कुंजी अभी भी जीवित रह सकती है। इसे बहुत अधिक सेट करना रेडिस के लिए एक ओवरहेड होगा। आप इसे सेट करने से पहले इस सेटिंग के साथ थोड़ा प्रयोग करना चाह सकते हैं। हम 10 के मूल्य का उपयोग कर रहे हैं।

  • +0

    उपयोगी जोड़ के लिए धन्यवाद। – joedevon

    +0

    आप पूरी तरह से सही @ गूर हैं, मैंने अभी इसे विभिन्न maxmemory और maxmemory-policy मानों के साथ परीक्षण किया है। –

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