我想跟踪有多少用户在线,我使用 Redis 来解决这个问题,因为一个或多个应用程序实例访问此缓存以显示状态。在每次新登录时,Redis 都会在键“online_users”上更新用户 ID,并在每次注销时删除用户。这种方法是否正确,如果不是,如何构建它以获得最佳性能和更大的数据集?
"online_users" -> {
user_s23,user_1f3,user_1mn,user_xd3
}
用户信息在缓存中可用,将状态作为另一个属性包含在内是否正确?
user_s23 {
name, id, profile_pic, type, etc, status:active/inactive
}
尽管这 2 approaches for tracking online users with Redis. Which one is faster?问题的答案比较了两种方法,提到的第一个链接不可用,所以我无法理解其他上下文。
最佳答案
如果你只想知道:
1-有多少用户在线
2- 哪些用户在线
3- 查找给定用户是否在线
并且你可以确保你可以跟踪EVERY注销和ALL用户调用注销请求,然后你可以使用set
并存储当用户登录时将用户 ID 添加到其中,并在用户注销时删除用户 ID(与您描述的方法相同)。
例子:
- user_a 登录:
> sadd online_users user_a
(integer) 1
- user_b 登录:
> sadd online_users user_b
(integer) 1
- 有多少用户在线?
> scard online_users
(integer) 2
- user_a 在线吗?
> sismember online_users user_a
(integer) 1
- user_a 注销:
> srem online_users user_a
(integer) 1
- 哪些用户在线?
> smembers online_users
1) "user_b"
所有这些操作都是 O(1) 除了 smembers
是 O(N),您唯一关心和限制的是用于存储这些数据的内存。提示是尝试为您的用户使用较小的 key ,如果不能,Redis 已经压缩了它们。
如果您不能确保跟踪注销,您可以使用问题“使用 Redis 跟踪在线用户的两种方法。哪种方法更快?”的第二种方法。
要使用这种方法,您需要跟踪用户的所有事件(不仅仅是登录),并使用时间戳将用户 ID 存储在不同的键上,例如:online_users_2014-02-20_10-01(在线用户位于2014 年 2 月 20 日 10:01)。
要回答当前有多少用户在线,您可以说,例如,如果用户在过去 3 分钟内至少发送了一个事件,则该用户被视为在线。然后计算最后 3 个集合的并集,并在结果集合上使用 scard 来找出有多少用户在线。
这种方法要昂贵得多,因为 sunion
是 O(N)。在您的 key 上添加超时(使用 expire
命令)是一个好主意,以帮助清理您的内存。
另一种方法是在最后一种方法的基础上,在客户端添加一些逻辑,即每分钟在后台为您的后端发送一个 PING 事件,然后您可以跟踪此事件,并且您将确保该用户设置在线。
关于redis - 使用 Redis 跟踪在线用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878540/