Na ramificação da versão atual do Redis (2.6) , você não pode receber notificações quando os itens expirarem. Provavelmente mudará com as próximas versões.
Enquanto isso, para atender ao seu requisito, você precisa implementar manualmente o suporte à notificação de expiração. Então você tem:
session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>
Você precisa remover
sessionid
do usuário definido quando a sessão expirar. Assim, você pode manter um conjunto classificado adicional cuja pontuação é um carimbo de data/hora. Ao criar a sessão 10 para o usuário 100:
MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC
Então, você precisa construir um daemon que irá pesquisar o zset para identificar a sessão a expirar (
ZRANGEBYSCORE
). Para cada sessão expirada, deve-se manter a estrutura de dados:- retire a sessão do zset (
ZREMRANGEBYRANK
) - recuperar o ID do usuário da sessão (
HMGET
) - excluir sessão (
DEL
) - remover sessão do conjunto de IDs de usuário (
SREM
)
A principal dificuldade é garantir que não haja condições de corrida quando o daemon pesquisa e processa os itens. Veja minha resposta a esta pergunta para ver como isso pode ser implementado:
como lidar com a expiração da sessão com base no redis?