Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Redis Update Diurutkan Set pada Key Expire

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara melewatkan data antara beberapa Status Lua (multi-utas)?

  2. Redis:Tampilkan ukuran/ukuran basis data untuk kunci

  3. Praktik Terbaik untuk Meningkatkan Redis dengan Sentinel?

  4. StackExchange.Redis:Akses batch untuk beberapa hash

  5. Bisakah Redis menulis ke database seperti PostgreSQL?