用Redis怎么搞在线用户数,实时查谁还在网上活跃呢
- 问答
- 2025-12-30 07:18:59
- 3
这个问题其实就是在问怎么用Redis这个速度快得像闪电的内存数据库,来统计当前有哪些用户正在使用你的网站或应用,并且能随时点名看谁在,想象一下你是一个活动的主持人,你需要知道现在会场里到底有多少人,以及具体是张三、李四还是王五在场,而不是那些已经离开的人,Redis就是帮你快速完成这个任务的得力助手。
核心思路特别简单,就是利用Redis速度快、能设置过期时间的特点,我们把每个上线用户当成一个独特的“入场券”,在Redis里做个记号,这个记号不能永久存在,用户一段时间不活动,它就自动消失,这样我们就知道用户下线了。
具体怎么做呢?最常见也最直接的方法叫做“心跳机制”。(来源:Redis官方文档关于键过期的说明以及常见的会话管理实践)
第一步:用户上线和保持活跃(发送心跳)
-
用户登录/开始活动:当用户成功登录你的应用,或者打开页面开始操作时,你的程序后台就要立刻向Redis发一个命令,这个命令大概是这样的:
SET user:用户ID:session 在线 EX 300,解释一下:user:用户ID:session:这是这个“入场券”的名字,比如用户ID是123,那这个键名就是user:123:session,用用户ID是为了唯一标识他。在线:这个值放什么都可以,甚至可以放更详细的信息,比如登录时间,但只是为了判断在不在线,简单写个“在线”或者“1”都行。EX 300:这是最关键的部分!它给这个键设置了一个300秒(5分钟)的“生存时间”,意思是,如果300秒内没有任何关于这个键的新操作,Redis就会自动把这个键删除掉,相当于这个“入场券”过期作废了。
-
用户持续活动(心跳):用户不可能一直操作,但他可能只是暂时没动鼠标,实际上还在线,为了防止他被误判为下线,我们需要让他“心跳”,也就是说,在用户每次点击页面、刷新数据、发送消息等任何操作时,你的程序都要悄悄地再向Redis发一个命令:
EXPIRE user:用户ID:session 300,这个命令的作用是,重新把这张“入场券”的过期时间重置为300秒,只要用户还在活动,这个“入场券”就永远不会过期。
第二步:判断用户是否在线(检查心跳)
当你想知道某个用户(比如ID是123)现在还在不在线时,非常简单,只需要向Redis发一个命令:EXISTS user:123:session。
- 如果Redis返回
1,说明这个键存在,意味着这个用户在最近5分钟内有活动,他是在线的。 - 如果Redis返回
0,说明这个键不存在(可能过期被删了,或者他压根没登录),那他就是离线状态。
第三步:实时查谁还在网上活跃(点名)
这是问题的后半部分,“实时查谁还在网上活跃”,这其实就是想知道当前Redis里所有还没过期的“入场券”都是谁的,这里有个小麻烦,Redis的键名是我们自己设计的,包含了用户ID(user:123:session),我们只需要想办法把所有符合user:*:session这个模式的键找出来就行了。
可以使用SCAN命令(或者它的简化版KEYS命令,但如果键非常多的话,用SCAN更安全)来模糊查找,命令大概是:SCAN 0 MATCH user:*:session。
- 这个命令会返回所有匹配的键名,
["user:123:session", "user:456:session", "user:789:session"]。 - 然后你的程序把这些键名解析一下,把里面的用户ID(123,456,789)提取出来,就知道是哪些用户在活跃了,活跃用户的总数,也就是这个列表的长度。
一些需要注意的细节和优化:
- 过期时间(心跳间隔)设置多长? 这取决于你的业务,如果是网页端,5分钟可能合适,如果是手机App,可能设置长一点,比如10分钟或15分钟,因为用户可能切换应用但并没退出,时间设太短,用户稍微发个呆就被踢下线了,体验不好,设太长,用户已经关掉页面了你还显示他在线,数据不准。
- 用户明确退出怎么办? 最好的做法是,当用户点击“退出登录”时,你的程序应该主动发一个
DEL user:用户ID:session命令,立刻删除这个键,这样他马上就显示为离线了,不用傻等过期。 - 性能问题:
SCAN命令在用户量极大的时候(比如几十万、上百万在线)可能会有点慢,因为它需要遍历所有的键,对于超大规模的场景,可以考虑使用Redis的集合(Set)或有序集合(Sorted Set)来统一管理所有在线用户的ID,这样统计总数和列表会更快,但那个方案稍微复杂一点,这个“心跳键”的方法对于绝大多数情况已经非常够用和简单易懂了。
用Redis搞在线用户数和实时查看活跃用户,核心就是为每个用户创建一个会定期过期的键,并通过用户的活动不断刷新这个过期时间,通过检查这些键的存在与否,你就能轻松实现“谁在线”和“有多少人在线”的实时查询了。

本文由太叔访天于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/71129.html
