Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Redis, expiração de sessão e pesquisa reversa


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?