2013-08-20 3 views
10

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

अब समय समाप्त होने के बाद, प्रवेश को फिर से एक्सेस करने का कोई तरीका है? मुझे नहीं लगता।

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

आशा है कि यह समझ में आता है। शायद हम स्पष्ट नहीं देख सकते हैं, इसलिए अग्रिम धन्यवाद!

+0

रेडिस 2.8 अभी भी एक रिलीज उम्मीदवार है। यदि आपको मुख्य समाप्ति अधिसूचनाओं के बारे में नियंत्रण की आवश्यकता है, तो शायद इसे स्पष्ट रूप से लागू करना बेहतर होगा (2.8 पर निर्भरता के बिना)। Http://stackoverflow.com/questions/11810020/how-to-handle- सत्र-expire-basing-redis/11815594#11815594 –

+2

ठीक है कि 2.8 अभी भी आरसी समस्या नहीं है। समस्या यह है कि रेडिस प्रविष्टि के मूल्य की बजाय कुंजी के साथ घटनाओं को प्रकाशित करता है। और चूंकि हमें सभी अधिसूचनाओं के लिए इस व्यवहार की आवश्यकता है, 2.6 भी। एक, हमें कुंजी के बजाए ईवेंट ट्रिगर होने पर हमें पूरी ऑब्जेक्ट देने के लिए रेडिस को बताने का एक तरीका चाहिए। –

+1

मैं अभी भी जेसेट –

उत्तर

25

एली से जुड़ी सुविधा आपको कुंजी की अवधि समाप्त होने पर सुनने की अनुमति देती है। हालांकि, यह आपको कुंजी का मूल्य नहीं देता है। दायर गिटूब मुद्दे के आधार पर फ़्यूथरमोर ऐसा नहीं लगता है कि आप कभी भी इस सुविधा को किसी भी समय (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) के अनुसार उपयोग करना चाहते हैं एक खाली स्ट्रिंग "" है। यह सेटअप करने के लिए थोड़ा और काम है लेकिन उपर्युक्त प्रणाली आपको वही करता है जो आपको चाहिए। ओवरहेड कुछ अतिरिक्त कमांड है जो वास्तव में आपकी कुंजी और रिक्त कुंजी की संग्रहण लागत को पुनर्प्राप्त करने और हटाने के लिए है।

+0

अच्छा विचार हालांकि यह उस मूल्य के पदचिह्न को दोगुना करता है । एक संभावित ट्विक केवल "छाया" कुंजी में मान संग्रहीत कर रहा है और केवल समाप्ति उद्देश्यों के लिए वास्तविक कुंजी का उपयोग कर रहा है। –

+1

@ItamarHaber छायादार वास्तविक मूल्य को संग्रहीत नहीं करता है। असल में, इस उत्तर के आधार पर (http://stackoverflow.com/questions/25557250/redis-store-key-without-value) छाया कुंजी मान केवल एक खाली स्ट्रिंग होना चाहिए (मेरे उदाहरण में मैंने इसे एक मूल्य दिया "1" लेकिन अब इसे अपडेट किया है)। तो एकमात्र ओवरहेड एक अतिरिक्त कुंजी है (आपको अपना मूल्य डुप्लिकेट नहीं करना चाहिए) – Sarus

+0

दाएं - इसे उल्टा पढ़ें :) –

1

यदि आप 2.8 पर हैं, तो आप this new feature (this page पर भी संदर्भित) का प्रयास कर सकते हैं। यह निश्चित रूप से अस्थिर है और अच्छी तरह से परीक्षण किया प्रतीत नहीं होता है, लेकिन अगर आप 2.8 वैसे भी पर हैं ...

मुद्दा पेज से कम परिचय:

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

उदाहरण के लिए मैं देखना जब कुंजी foo हटा दी जाती है या किसी तरह से संशोधित, या (आदेश की समय सीमा समाप्त का प्रयोग करके) एक के साथ सभी चाबियों का नाम प्राप्त करने के लिए सेट समय सीमा समाप्त हो कि Redis से हटाना उतना है दिलचस्पी हो सकती है डेटासेट क्योंकि उनके रहने का समय शून्य हो गया।

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

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