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

回到顶部