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 ?