Fitur yang ditautkan Eli memungkinkan Anda mendengarkan saat kunci kedaluwarsa. Namun, itu tidak memberi Anda nilai kuncinya. Selanjutnya, berdasarkan masalah github yang diajukan, sepertinya Anda tidak dapat mengharapkan fitur ini dibangun dalam waktu dekat (https://github.com/antirez/redis/issues/1876). Solusi yang saya gunakan adalah membuat kunci kedaluwarsa "bayangan" khusus yang ditautkan ke kunci di mana Anda memiliki nilai sebenarnya.
Jadi katakanlah Anda memiliki kunci yang disebut testkey
dan memiliki nilai integer 100
. Selanjutnya, kunci akan kedaluwarsa setelah 10 detik di mana Anda ingin mendapatkan nilai kunci. (Mungkin Anda menambah kunci selama 10 detik itu ada).
Pertama, Anda perlu mengatur mendengarkan untuk acara keyspace. Khususnya Anda ingin mendengarkan expired
acara. Anda dapat melakukan ini dari konfigurasi Anda atau menggunakan config set
perintah di redis. (lihat di sini untuk info lebih lanjut:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Sekarang Anda dapat berlangganan keyevent
khusus saluran tempat Anda akan diberi tahu bahwa kunci tersebut kedaluwarsa.
SUBSCRIBE [email protected]__:expired
Format saluran untuk berlangganan adalah [email protected]<db>__:<eventName>
. Dalam contoh kita, kita mengasumsikan kita bekerja dengan database default 0 dan kita ingin mendengarkan expired
acara.
Ketika testkey
kedaluwarsa Anda sekarang akan mendapatkan pesan di __keyevent__
saluran di mana pesannya adalah nama kunci yang kedaluwarsa. Tentu saja saat ini kuncinya hilang sehingga kita tidak bisa lagi mengakses nilainya! Solusinya adalah dengan menggunakan kunci kedaluwarsa khusus.
Saat Anda membuat testkey
juga buat kunci "bayangan" khusus yang kedaluwarsa (jangan kedaluwarsa testkey
yang sebenarnya ). Misalnya:
SET testkey 100
SET shadowkey:testkey "" EX 10
Sekarang di [email protected]__:expired
saluran Anda akan mendapatkan pesan yang memberi tahu Anda bahwa kunci shadowkey:testkey
kedaluwarsa. Ambil nilai pesan (yang merupakan nama kunci), bagi pada titik dua (atau pemisah apa pun yang Anda putuskan untuk digunakan), lalu dapatkan nilai kunci secara manual dan hapus.
// 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
Perhatikan bahwa nilai shadowkey tidak digunakan sehingga Anda ingin menggunakan nilai sekecil mungkin yang menurut jawaban ini (Redis store key tanpa nilai) adalah string kosong ""
. Ini sedikit lebih banyak pekerjaan untuk diatur tetapi sistem di atas melakukan apa yang Anda butuhkan. Overhead adalah beberapa perintah tambahan untuk benar-benar mengambil dan menghapus kunci Anda ditambah biaya penyimpanan kunci kosong.