Redis
 sql >> Database >  >> NoSQL >> Redis

Aggiornamento Redis ordinato impostato alla scadenza della chiave

Hai ragione non puoi "mettere una scadenza" sul valore impostato ordinato stesso.

Ma puoi lavorare con la chiave principale e catturare l'evento quando si verifica la scadenza. Hai almeno 2 modi per raggiungere questo obiettivo:

  • Utilizzo della notifica spazio chiave
  • Utilizzo di Redis Gears

Notifica spazio chiave

Utilizzando la notifica dello spazio chiave, puoi acquisire l'evento EXPIRE che invierà un messaggio PUBLISH che potrai quindi utilizzare.

Lascia che ti spieghi il flusso di base:

Configura le notifiche

CONFIG SET notify-keyspace-events Ex
  • E :eventi accaduti sui tasti
  • x :cattura gli eventi scaduti

Ora il tuo database pubblicherà un evento su __key*__:* canale.

Quindi puoi creare un servizio che ascolti questi eventi aggiornare il set (direttamente o indirettamente):

psubscribe __key*__:*

Se hai un'applicazione che imposta il valore e la scadenza seguenti

set foo bar EX 5

Dovresti ricevere il seguente messaggio

1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"

Ingranaggi Redis

Usando Redis Gears, catturi lo stesso evento (anche questo si basa sulla notifica), ma è più facile scrivere il codice direttamente nel tuo database Redis.

Puoi creare un Gears come segue:(questo è uno script Python, sto usando RedisInsight per distribuirlo a 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)

Guarda la sezione iniziata da cap = GB('KeysReader')

  • Questo ascolterà qualsiasi scadenza della chiave prefix='*' &eventTypes=['expired']
  • In caso di scadenza aggiungerà un messaggio al 'expired:events' Redis Stream utilizzando il comando XADD
  • Quindi guarda la funzione proc = GB('StreamReader') che elaborerà i flussi
  • ogni volta che un nuovo messaggio è nello stream, chiamerà process() funzione.

Puoi aggiungere la tua logica per aggiornare il set ordinato in questa funzione. Nel mio esempio ho appena aggiunto la chiave scaduta a un elenco.

Vorrei discostarmi un po' dalla tua domanda iniziale.

Sembra che tu stia utilizzando il set ordinato per creare una forma di indicizzazione per i tuoi dati.

Se questo è il caso, dovresti guardare RediSearch, un altro modulo Redis che ti consente di indicizzare Hash campi e quindi utilizzare l'indice per eseguire alcune query e aggregazioni avanzate.

Con RediSearch non è necessario aggiungere alcun codice per gestire l'indice, lo fa automaticamente dal database e puoi interrogare i campi.

Ti invito a guardare:

  • Il modulo RediSearch
  • Come iniziare RediSearch

Scusa se questo non è il motivo per cui stai utilizzando Sorted Set, ma penso che valga la pena controllare in quanto potrebbe semplificare molto il codice dell'applicazione se gestisci l'indice manualmente oggi.