我目前正在构建一个网络应用程序,并想使用 Redis 来存储会话。登录时,会话会使用相应的用户 ID 插入到 Redis 中,并且过期时间设置为 15 分钟。我现在想实现会话的反向查找(获取具有特定用户 ID 的会话)。这里的问题是,由于我无法搜索Redis键空间,因此如何实现这一点。一种方法是为每个 userId 设置一个 redis,其中包含所有会话 ID。但由于 Redis 不允许集合中的项目过期,并且会话设置为过期,因此集合中将存在大量不存在的会话 ID。
在密钥过期时从集合中删除 id 的最佳方法是什么?或者,有没有更好的方法来完成我想要的(反向查找)?
在当前版本分支上雷迪斯 (2.6),当物品过期时,您无法收到通知。它可能会随着下一个版本而改变。
同时,为了支持您的要求,您需要手动实现过期通知支持。所以你有了:
session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>
你需要删除sessionid
会话过期时从用户设置。因此,您可以维护一个额外的排序集,其分数是时间戳。
当您为用户 100 创建会话 10 时:
MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC
然后,您需要构建一个守护进程,它将轮询 zset 以识别要过期的会话(ZRANGEBYSCORE https://redis.io/commands/zrangebyscore)。对于每个过期的会话,它必须维护数据结构:
- 将会话从 zset 中弹出(ZREMRANGEBYRANK https://redis.io/commands/zremrangebyrank)
- 检索会话用户 ID (HMGET https://redis.io/commands/hmget)
- 删除会话(DEL https://redis.io/commands/del)
- 从用户 ID 集中删除会话(SREM https://redis.io/commands/srem)
主要困难是确保守护进程轮询和处理项目时不存在竞争条件。请参阅我对此问题的回答,了解如何实施:
基于redis如何处理session过期? https://stackoverflow.com/questions/11810020/how-to-handle-session-expire-basing-redis/11815594#11815594
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)