आश्चर्य (कोई समाप्ति घटना नहीं देखी गई जब एक कुंजी के लिए जीने का समय शून्य तक पहुंच जाता है) पायथन के लिए बाध्य नहीं है, बल्कि जिस तरह से, रेडिस कुंजी समाप्त कर रहा है।
समय सीमा समाप्त घटनाओं के समय पर रेडिस दस्तावेज़
समय सीमा समाप्त ईवेंट का समय
रहने के समय से जुड़ी कुंजियाँ Redis द्वारा दो तरह से समाप्त की जाती हैं:
- जब कुंजी को कमांड द्वारा एक्सेस किया जाता है और यह पाया जाता है कि यह समाप्त हो गया है।
- ऐसी पृष्ठभूमि प्रणाली के माध्यम से, जो पृष्ठभूमि में समय-सीमा समाप्त हो चुकी कुंजियों की तलाश करती है, क्रमिक रूप से, ताकि उन कुंजियों को भी एकत्र करने में सक्षम हो जो कभी एक्सेस नहीं की जाती हैं।
समाप्त होने वाली घटनाएं तब उत्पन्न होती हैं जब एक कुंजी का उपयोग किया जाता है और उपरोक्त सिस्टमों में से किसी एक द्वारा समाप्त हो गया पाया जाता है, नतीजतन इस बात की कोई गारंटी नहीं है कि रेडिस सर्वर उस समय समाप्त होने वाली घटना को उत्पन्न करने में सक्षम होगा जीने के लिए महत्वपूर्ण समय शून्य के मान तक पहुँच जाता है।
यदि कोई कमांड लगातार कुंजी को लक्षित नहीं करता है, और टीटीएल के साथ कई कुंजियां जुड़ी हुई हैं, तो महत्वपूर्ण समय के लाइव होने का समय शून्य हो जाता है, और समय समाप्त होने वाली घटना उत्पन्न होने के बीच एक महत्वपूर्ण देरी हो सकती है।
मूल रूप से समाप्त होने वाली घटनाएं जब रेडिस सर्वर कुंजी को हटाता है तो उत्पन्न होते हैं और तब नहीं जब जीने का समय सैद्धांतिक रूप से शून्य के मूल्य तक पहुंच जाए।
कंसोल पर छोटा परीक्षण
जब रेडिस चल रहा हो ($ sudo service redis-server start )
मैंने एक कंसोल शुरू किया है और सदस्यता ली है:
$ redis-cli
PSUBSCRIBE "__key*__:*"
फिर, दूसरे कंसोल में:
$ redis-cli
> config set notify-keyspace-events AKE
क्या सभी प्रकार के आयोजनों की सदस्यता लेगा
फिर मैंने इस दूसरे कंसोल में प्रयोग जारी रखा:
> set aaa aaa
> del aaa
> set aaa ex 5
> get aaa
सब्स्क्राइब्ड कंसोल में सभी गतिविधियां देखी गईं। केवल कुंजी की समय सीमा समाप्त होने में कुछ सेकंड की देरी हुई, कभी-कभी समय पर आ गई।
ध्यान दें, संदेशों में सूक्ष्म अंतर हैं, एक संदेश example@sqldat.com__:expire एक और example@sqldat.com__:expired ।
नमूना श्रोता spy.py
import redis
import time
r = redis.StrictRedis()
pubsub = r.pubsub()
pubsub.psubscribe("*")
for msg in pubsub.listen():
print time.time(), msg
यह कोड सभी मौजूदा चैनलों में डिफ़ॉल्ट रेडिस में पंजीकृत होता है और जो कुछ भी प्रकाशित होता है उसे प्रिंट करता है।
इसे चलाएं:
$ python spy.py
और दूसरे कंसोल में एक समाप्ति के साथ एक कुंजी सेट करने का प्रयास करें। आप सभी इवेंट देखेंगे।
निम्नलिखित रेडिस-क्ली इनपुट के लिए।
$ redis-cli
127.0.0.1:6379> set a aha
OK
127.0.0.1:6379> set b bebe ex 3
OK
127.0.0.1:6379> set b bebe ex 3
OK
हमें स्पाई आउटपुट मिलता है:
1401548400.27 {'pattern': None, 'type': 'psubscribe', 'channel': '*', 'data': 1L}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:a', 'data': 'set'}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:set', 'data': 'a'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:b', 'data': 'set'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:set', 'data': 'b'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:b', 'data': 'expire'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:expire', 'data': 'b'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:b', 'data': 'expired'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:expired', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:b', 'data': 'set'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:set', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:b', 'data': 'expire'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:expire', 'data': 'b'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:b', 'data': 'expired'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': 'example@sqldat.com__:expired', 'data': 'b'}