sql >> Base de Datos >  >> NoSQL >> Redis

Redis, caducidad de la sesión y búsqueda inversa

En la rama de versión actual de Redis (2.6) , no puede recibir notificaciones cuando los artículos caducan. Probablemente cambiará con las próximas versiones.

Mientras tanto, para cumplir con su requisito, debe implementar manualmente el soporte de notificación de caducidad. Así que tienes:

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

Debe eliminar sessionid del usuario establecido cuando caduca la sesión. De modo que puede mantener un conjunto ordenado adicional cuya puntuación es una marca de tiempo.

Cuando crea la sesión 10 para el usuario 100:

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

Luego, debe crear un demonio que sondeará el zset para identificar la sesión que expirará (ZRANGEBYSCORE ). Para cada sesión expirada, tiene que mantener la estructura de datos:

  • saque la sesión del zset (ZREMRANGEBYRANK )
  • recuperar ID de usuario de sesión (HMGET )
  • eliminar sesión (DEL )
  • eliminar sesión del conjunto de ID de usuario (SREM )

La principal dificultad es asegurarse de que no haya condiciones de carrera cuando el daemon sondea y procesa los elementos. Vea mi respuesta a esta pregunta para ver cómo se puede implementar:

¿Cómo manejar la caducidad de la sesión basada en Redis?