Anda benar, Anda tidak dapat "menempatkan kedaluwarsa" pada nilai set yang diurutkan itu sendiri.
Tetapi Anda dapat bekerja dengan kunci utama dan merekam peristiwa saat kedaluwarsa terjadi. Anda memiliki setidaknya 2 cara untuk mencapai ini:
- Menggunakan Notifikasi Key Space
- Menggunakan Redis Gears
Pemberitahuan Ruang Kunci
Dengan menggunakan Notifikasi Ruang Kunci, Anda dapat merekam peristiwa EXPIRE yang akan mengirimkan pesan PUBLISH yang kemudian dapat Anda konsumsi.
Mari saya jelaskan alur dasarnya:
Konfigurasi Notifikasi
CONFIG SET notify-keyspace-events Ex
- E :peristiwa yang terjadi pada tombol
- x :merekam acara yang kedaluwarsa
Sekarang database Anda akan memublikasikan acara di __key*__:*
saluran.
Jadi Anda dapat membangun layanan yang mendengarkan acara ini memperbarui set (langsung atau tidak langsung):
psubscribe __key*__:*
Jika Anda memiliki aplikasi yang menetapkan nilai dan masa berlaku berikut
set foo bar EX 5
Anda akan menerima pesan berikut
1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"
Redis Gears
Menggunakan Redis Gears, Anda merekam peristiwa yang sama (ini juga didasarkan pada notifikasi), tetapi lebih mudah untuk menulis kode secara langsung di Database Redis Anda.
Anda dapat membuat Gears sebagai berikut:(ini adalah skrip Python, saya menggunakan RedisInsight untuk menyebarkannya ke Redis)
def process(x):
execute('LPUSH', 'expired:keys', x['value']['key']);
# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
mode='sync',
eventTypes=['expired'],
readValue=False)
# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
batch=100,
duration=1,
trimStream = False)
Lihat bagian yang diawali dengan cap = GB('KeysReader')
- Ini akan mendengarkan kedaluwarsa kunci apa pun
prefix='*'
&eventTypes=['expired']
- Jika kedaluwarsa, pesan akan ditambahkan ke
'expired:events'
Redis Stream menggunakan perintah XADD - Kemudian lihat fungsi
proc = GB('StreamReader')
yang akan memproses streaming - setiap kali ada pesan baru dalam aliran, ia akan memanggil
process()
fungsi.
Anda dapat menambahkan logika Anda untuk memperbarui set yang diurutkan dalam fungsi ini. Dalam contoh saya, saya baru saja menambahkan kunci kedaluwarsa ke daftar.
Biarkan saya menyimpang sedikit dari pertanyaan awal Anda.
Sepertinya Anda menggunakan Kumpulan Terurut untuk membuat beberapa bentuk pengindeksan untuk data Anda.
Jika demikian, Anda harus melihat RediSearch, modul Redis lain yang memungkinkan Anda untuk mengindeks Hash bidang dan kemudian gunakan indeks untuk melakukan beberapa kueri dan agregasi lanjutan.
Dengan RediSearch, Anda tidak perlu menambahkan kode apa pun untuk mengelola indeks, hal itu dilakukan secara otomatis oleh database, dan Anda dapat melakukan kueri pada bidang tersebut.
Saya mengundang Anda untuk melihat:
- Modul RediSearch
- Memulai RediSearch
Maaf jika ini bukan alasan Anda menggunakan Sorted Set, tetapi saya pikir ini layak untuk diperiksa karena dapat menyederhanakan banyak kode aplikasi Anda jika Anda mengelola indeks secara manual hari ini.