Redis 如何实现Map的value过期呢?
需求是这样的:
用户状态的数据结构
用户id: 用户状态(在线,禁言,限制登陆等),user:id:123 -> 0
开始我是把用户id直接用 set 进redis,最简单的数据结构,然后去更新对应的状态
后来需要统计在线用户,把id查到返回,似乎只能通过正则 user:id*
把相关的keys查到,然后代码中去判断状态是否是在线的
但是 user:id*
耗时太慢了,考虑换成map,这样直接定位到map,减少了 user:id*
这种匹配查询
又发现我的key是需要设置过期时间的,user:id:123
不是一直有效的,map又不能设置value的过期时间
有点纠结,我感觉需要多个辅助数据结构来实现功能,有没有既能利用redis的过期时间,又能提高查询效率的办法?(感觉我可能需要这样一个容器结构,能把全部 user:id*
放到一起,这样查询效率高,然后我再去设置每个key的过期时间)
求指教
回答:
好吧,我用的java,redission太强大了,有RMapCache可以实现map元素单独设置过期时间,文档 https://www.bookstack.cn/read... 看了文档找到了解决方案,其它语言的灵活发挥吧
回答:
如果你只是用来统计用户在线人数的需求,V2EX 有个巧妙的方案,虽然不一定准确。
单独弄一个 db 来放这些信息,比如 A 请求过来后,设置一个 key,然后设置过期时间,每次请求过来都去设置(延长)过期时间。
SETEX KEY_NAME TIMEOUT VALUE
大概就是这个样子,然后需要统计在线人数的时候,使用 dbsize
即可?。
这个方法来源于下面这个帖子,当然,帖子中有更多巧妙的方法,比如使用 zset 。
- 关于用 Redis 做在线人数统计 - V2EX
回答:
既然你都用redis了,那就推荐个超级神器吧,bitmap对于你这个用户在线最舒服了
以上是 Redis 如何实现Map的value过期呢? 的全部内容, 来源链接: utcz.com/p/944134.html