Kejutannya (tidak ada peristiwa kedaluwarsa yang terlihat saat waktu hidup untuk sebuah kunci mencapai nol) tidak terikat pada Python, melainkan pada cara, Redis adalah kunci yang kedaluwarsa.
Redis doc tentang Waktu acara yang kedaluwarsa
Waktu acara yang kedaluwarsa
Kunci dengan waktu untuk hidup yang terkait kedaluwarsa oleh Redis dalam dua cara:
- Saat kunci diakses oleh sebuah perintah dan ternyata kedaluwarsa.
- Melalui sistem latar belakang yang mencari kunci kedaluwarsa di latar belakang, secara bertahap, agar dapat juga mengumpulkan kunci yang tidak pernah diakses.
Peristiwa kadaluarsa dihasilkan ketika kunci diakses dan ditemukan kedaluwarsa oleh salah satu sistem di atas, akibatnya tidak ada jaminan bahwa server Redis akan dapat menghasilkan peristiwa kedaluwarsa pada waktu kunci waktu untuk hidup mencapai nilai nol.
Jika tidak ada perintah yang menargetkan kunci secara terus-menerus, dan ada banyak kunci dengan TTL yang terkait, akan ada penundaan yang signifikan antara waktu waktu kunci untuk hidup turun ke nol, dan waktu peristiwa kedaluwarsa dibuat.
Pada dasarnya acara yang kedaluwarsa dihasilkan ketika server Redis menghapus kunci dan bukan ketika waktu untuk hidup secara teoritis mencapai nilai nol.
Tes kecil di konsol
saat Redis berjalan ($ sudo service redis-server start
)
Saya memulai satu konsol dan telah berlangganan:
$ redis-cli
PSUBSCRIBE "__key*__:*"
Kemudian, di konsol lain:
$ redis-cli
> config set notify-keyspace-events AKE
apa yang harus berlangganan semua jenis acara
Kemudian saya melanjutkan eksperimen di konsol kedua ini:
> set aaa aaa
> del aaa
> set aaa ex 5
> get aaa
Semua aktivitas terlihat di konsol berlangganan. Hanya masa berlaku kunci yang terkadang tertunda beberapa detik, terkadang datang tepat waktu.
Perhatikan juga, ada perbedaan halus dalam pesan, satu pesan [email protected]__:expire
[email protected]__:expired
lainnya .
Contoh pendengar spy.py
import redis
import time
r = redis.StrictRedis()
pubsub = r.pubsub()
pubsub.psubscribe("*")
for msg in pubsub.listen():
print time.time(), msg
Kode ini mendaftar ke semua saluran yang ada dalam redis default dan mencetak apa pun yang dipublikasikan.
Jalankan:
$ python spy.py
dan di konsol lain coba setel kunci dengan kedaluwarsa. Anda akan melihat semua acara.
Untuk mengikuti masukan redis-cli.
$ 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
kami mendapatkan keluaran mata-mata:
1401548400.27 {'pattern': None, 'type': 'psubscribe', 'channel': '*', 'data': 1L}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:a', 'data': 'set'}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'a'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'set'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'b'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expire'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expire', 'data': 'b'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expired'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expired', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'set'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expire'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expire', 'data': 'b'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expired'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expired', 'data': 'b'}