एली से जुड़ी सुविधा आपको कुंजी की अवधि समाप्त होने पर सुनने की अनुमति देती है। हालांकि, यह आपको कुंजी का मूल्य नहीं देता है। दायर गिटूब मुद्दे के आधार पर फ़्यूथरमोर ऐसा नहीं लगता है कि आप कभी भी इस सुविधा को किसी भी समय (https://github.com/antirez/redis/issues/1876) में निर्मित होने की उम्मीद कर सकते हैं। मैं जिस समाधान का उपयोग करता हूं वह एक विशेष "छाया" समाप्ति कुंजी बनाना है जो उस कुंजी से जुड़ा हुआ है जहां आपके पास वास्तविक मूल्य है।
तो मान लें कि आपके पास testkey
नामक एक कुंजी है और इसमें 100
का पूर्णांक मान है। इसके अलावा, कुंजी 10 सेकंड के बाद समाप्त हो जाएगी, जिस बिंदु पर आप कुंजी का मूल्य प्राप्त करना चाहते हैं। (हो सकता है कि आप 10 सेकंड के दौरान कुंजी को बढ़ा रहे हों)।
सबसे पहले आपको कुंजीपटल घटनाओं के लिए सुनना स्थापित करना होगा।विशेष रूप से आप expired
घटनाओं को सुनना चाहते हैं। आप इसे अपनी कॉन्फ़िगरेशन से कर सकते हैं या रेडिस में config set
कमांड का उपयोग कर सकते हैं। (अधिक जानकारी के लिए यहाँ देखें: http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
अब आप एक विशेष keyevent
चैनल जहां आपको सूचित किया जाएगा कि कुंजी की समय सीमा समाप्त करने के लिए सदस्यता ले सकते हैं।
SUBSCRIBE [email protected]__:expired
सदस्यता लेने के लिए चैनल का प्रारूप [email protected]<db>__:<eventName>
है। हमारे उदाहरण में हम मानते हैं कि हम डिफ़ॉल्ट डेटाबेस 0 के साथ काम कर रहे हैं और हम expired
ईवेंट सुनना चाहते हैं।
जब testkey
की समयसीमा समाप्त हो जाती है तो आपको अब __keyevent__
चैनल में एक संदेश मिलेगा जहां संदेश समाप्त होने वाली कुंजी का नाम है। बेशक इस बिंदु पर कुंजी चली गई है ताकि हम अब मूल्य तक नहीं पहुंच सकें! समाधान एक विशेष समाप्ति कुंजी का उपयोग करना है।
जब आप अपना testkey
बनाते हैं तो एक विशेष समाप्ति "छाया" कुंजी भी बनाएं (वास्तविक testkey
की अवधि समाप्त न करें)। उदाहरण के लिए:
SET testkey 100
SET shadowkey:testkey "" EX 10
अब [email protected]__:expired
चैनल में आप एक संदेश जो आपको बताएगा कि कुंजी shadowkey:testkey
समाप्त हो गई है मिल जाएगा। संदेश का मान लें (जो कुंजी का नाम है), कोलन पर विभाजित करें (या जो भी विभाजक आप उपयोग करने का निर्णय लेते हैं), और उसके बाद मैन्युअल रूप से कुंजी का मान प्राप्त करें और इसे हटा दें।
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
ध्यान दें कि shadowkey का मूल्य नहीं किया जाता है तो आप छोटी संभव मूल्य जो इस जवाब (Redis store key without a value) के अनुसार उपयोग करना चाहते हैं एक खाली स्ट्रिंग ""
है। यह सेटअप करने के लिए थोड़ा और काम है लेकिन उपर्युक्त प्रणाली आपको वही करता है जो आपको चाहिए। ओवरहेड कुछ अतिरिक्त कमांड है जो वास्तव में आपकी कुंजी और रिक्त कुंजी की संग्रहण लागत को पुनर्प्राप्त करने और हटाने के लिए है।
रेडिस 2.8 अभी भी एक रिलीज उम्मीदवार है। यदि आपको मुख्य समाप्ति अधिसूचनाओं के बारे में नियंत्रण की आवश्यकता है, तो शायद इसे स्पष्ट रूप से लागू करना बेहतर होगा (2.8 पर निर्भरता के बिना)। Http://stackoverflow.com/questions/11810020/how-to-handle- सत्र-expire-basing-redis/11815594#11815594 –
ठीक है कि 2.8 अभी भी आरसी समस्या नहीं है। समस्या यह है कि रेडिस प्रविष्टि के मूल्य की बजाय कुंजी के साथ घटनाओं को प्रकाशित करता है। और चूंकि हमें सभी अधिसूचनाओं के लिए इस व्यवहार की आवश्यकता है, 2.6 भी। एक, हमें कुंजी के बजाए ईवेंट ट्रिगर होने पर हमें पूरी ऑब्जेक्ट देने के लिए रेडिस को बताने का एक तरीका चाहिए। –
मैं अभी भी जेसेट –