इसलिए जब रेडिस में सत्र समाप्त हो जाता है तो आपको अपने आवेदन को अधिसूचित करने की आवश्यकता होती है।
जबकि रेडिस इस सुविधा का समर्थन नहीं करता है, आप इसे लागू करने के लिए कई तरकीबों का उपयोग कर सकते हैं।
अपडेट:संस्करण 2.8.0 से, Redis इस http://redis.io/topics/notifications का समर्थन करता है
सबसे पहले, लोग इसके बारे में सोच रहे हैं:यह अभी भी चर्चा में है, लेकिन इसे रेडिस के भविष्य के संस्करण में जोड़ा जा सकता है। निम्नलिखित मुद्दे देखें:
- https://github.com/antirez/redis/issues/83
- https://github.com/antirez/redis/issues/594
अब, यहां कुछ समाधान दिए गए हैं जिनका उपयोग आप वर्तमान Redis संस्करणों के साथ कर सकते हैं।
समाधान 1:Redis को पैच करना
दरअसल, जब रेडिस प्रमुख समाप्ति करता है तो एक साधारण अधिसूचना जोड़ना इतना कठिन नहीं होता है। इसे Redis स्रोत कोड की db.c फ़ाइल में 10 लाइनें जोड़कर कार्यान्वित किया जा सकता है। यहां एक उदाहरण दिया गया है:
https://gist.github.com/3258233
यदि कुंजी समाप्त हो गई है और '@' वर्ण (मनमाना विकल्प) से शुरू होती है तो यह छोटा पैच #expired सूची में एक कुंजी पोस्ट करता है। इसे आसानी से आपकी आवश्यकताओं के अनुकूल बनाया जा सकता है।
तब अपने सत्र ऑब्जेक्ट के लिए समाप्ति समय निर्धारित करने के लिए EXPIRE या SETEX कमांड का उपयोग करना तुच्छ है, और एक छोटा डेमॉन लिखें जो "#expired" सूची से बाहर निकलने के लिए BRPOP पर लूप करता है, और आपके एप्लिकेशन में अधिसूचना का प्रचार करता है।पी>
एक महत्वपूर्ण बिंदु यह समझना है कि रेडिस में समाप्ति तंत्र कैसे काम करता है। समाप्ति के लिए वास्तव में दो अलग-अलग पथ हैं, दोनों एक ही समय में सक्रिय हैं:
-
आलसी (निष्क्रिय) तंत्र। हर बार किसी कुंजी तक पहुंचने पर समय-सीमा समाप्त हो सकती है।
-
सक्रिय तंत्र। एक आंतरिक कार्य नियमित रूप से (बेतरतीब ढंग से) समाप्ति सेट के साथ कई कुंजियों का नमूना लेता है, जो समाप्त होने वाली कुंजियों को खोजने का प्रयास करते हैं।
ध्यान दें कि उपरोक्त पैच दोनों पथों के साथ ठीक काम करता है।
परिणाम रेडिस समाप्ति समय सटीक नहीं है। यदि सभी कुंजियों की समय सीमा समाप्त हो गई है, लेकिन केवल एक की समय सीमा समाप्त होने वाली है, और इसे एक्सेस नहीं किया जाता है, तो सक्रिय समाप्ति कार्य को कुंजी खोजने में कई मिनट लग सकते हैं और इसकी समय सीमा समाप्त हो सकती है। यदि आपको सूचना में कुछ सटीकता की आवश्यकता है, तो यह रास्ता नहीं है।
समाधान 2:zsets के साथ समाप्ति का अनुकरण करना
यहां विचार रेडिस कुंजी समाप्ति तंत्र पर भरोसा नहीं करना है, बल्कि एक अतिरिक्त सूचकांक और एक मतदान डेमॉन का उपयोग करके इसे अनुकरण करना है। यह एक असंशोधित Redis 2.6 संस्करण के साथ काम कर सकता है।
हर बार जब कोई सत्र Redis में जोड़ा जाता है, तो आप चला सकते हैं:
MULTI
SET <session id> <session content>
ZADD to_be_expired <current timestamp + session timeout> <session id>
EXEC
to_be_expired सॉर्ट किया गया सेट पहली कुंजी तक पहुंचने का एक प्रभावी तरीका है जिसे समाप्त किया जाना चाहिए। एक डेमॉन निम्न लुआ सर्वर-साइड स्क्रिप्ट का उपयोग करके to_be_expired पर मतदान कर सकता है:
local res = redis.call('ZRANGEBYSCORE',KEYS[1], 0, ARGV[1], 'LIMIT', 0, 10 )
if #res > 0 then
redis.call( 'ZREMRANGEBYRANK', KEYS[1], 0, #res-1 )
return res
else
return false
end
स्क्रिप्ट को लॉन्च करने का कमांड होगा:
EVAL <script> 1 to_be_expired <current timestamp>
डेमॉन को अधिकतम 10 आइटम मिलेंगे। उनमें से प्रत्येक के लिए, इसे सत्रों को हटाने और एप्लिकेशन को सूचित करने के लिए DEL कमांड का उपयोग करना होगा। यदि एक आइटम वास्तव में संसाधित किया गया था (यानी लुआ स्क्रिप्ट की वापसी खाली नहीं है), डेमॉन को तुरंत लूप करना चाहिए, अन्यथा 1 सेकंड की प्रतीक्षा स्थिति पेश की जा सकती है।
लुआ स्क्रिप्ट के लिए धन्यवाद, समानांतर में कई मतदान डेमॉन लॉन्च करना संभव है (स्क्रिप्ट गारंटी देता है कि किसी दिए गए सत्र को केवल एक बार संसाधित किया जाएगा, क्योंकि लुआ स्क्रिप्ट द्वारा कुंजी को to_be_expired से हटा दिया जाता है)।
समाधान 3:बाहरी वितरित टाइमर का उपयोग करें
एक अन्य समाधान बाहरी वितरित टाइमर पर भरोसा करना है। बीनस्टॉक लाइटवेट क्यूइंग सिस्टम इसके लिए एक अच्छी संभावना है
हर बार सिस्टम में एक सत्र जोड़ा जाता है, एप्लिकेशन सत्र आईडी को एक बीनस्टॉक कतार में पोस्ट करता है जिसमें सत्र समय समाप्त होने के अनुरूप देरी होती है। एक डेमॉन कतार को सुन रहा है। जब यह किसी आइटम को हटा सकता है, तो इसका मतलब है कि एक सत्र समाप्त हो गया है। इसे सिर्फ रेडिस में सत्र को साफ करना है, और आवेदन को सूचित करना है।