Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis, expiration de session et recherche inversée

Sur la branche de version actuelle de Redis (2.6) , vous ne pouvez pas recevoir de notifications lorsque les éléments sont arrivés à expiration. Cela changera probablement avec les prochaines versions.

En attendant, pour répondre à vos besoins, vous devez implémenter manuellement la prise en charge des notifications d'expiration. Vous avez donc :

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

Vous devez supprimer sessionid de l'utilisateur défini à l'expiration de la session. Ainsi, vous pouvez conserver un ensemble trié supplémentaire dont le score est un horodatage.

Lorsque vous créez la session 10 pour l'utilisateur 100 :

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

Ensuite, vous devez construire un démon qui interrogera le zset pour identifier la session à expirer (ZRANGEBYSCORE ). Pour chaque session expirée, il doit maintenir la structure des données :

  • sortir la session du zset (ZREMRANGEBYRANK )
  • récupérer l'ID utilisateur de la session (HMGET )
  • supprimer la session (DEL )
  • supprimer la session de l'ensemble d'ID utilisateur (SREM )

La principale difficulté est de s'assurer qu'il n'y a pas de conditions de concurrence lorsque le démon interroge et traite les éléments. Voir ma réponse à cette question pour voir comment cela peut être mis en œuvre :

comment gérer l'expiration de la session en se basant sur redis ?