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

Redis, scadenza sessione e ricerca inversa

Sul ramo di rilascio corrente di Redis (2.6) , non puoi ricevere notifiche quando gli articoli sono scaduti. Probabilmente cambierà con le prossime versioni.

Nel frattempo, per supportare la tua esigenza, devi implementare manualmente il supporto per la notifica di scadenza. Quindi hai:

session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>

Devi rimuovere sessionid dall'utente impostato alla scadenza della sessione. In questo modo puoi mantenere un set ordinato aggiuntivo il cui punteggio è un timestamp.

Quando crei la sessione 10 per l'utente 100:

MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC

Quindi, devi creare un demone che eseguirà il polling di zset per identificare la sessione in scadenza (ZRANGEBYSCORE ). Per ogni sessione scaduta, deve mantenere la struttura dei dati:

  • estrarre la sessione da zset (ZREMRANGEBYRANK )
  • recupera l'id utente della sessione (HMGET )
  • elimina sessione (DEL )
  • rimuove la sessione dal set di ID utente (SREM )

La difficoltà principale è garantire che non ci siano condizioni di gara quando il demone esegue il polling ed elabora gli elementi. Vedi la mia risposta a questa domanda per vedere come può essere implementata:

come gestire la scadenza della sessione basando il redis?