redis - 使用 Redis 跟踪在线用户

标签 redis

我想跟踪有多少用户在线,我使用 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/

相关文章:

java - RMI - 线程池子线程套接字权限问题

docker - 在 k8s 中部署 Redis 时使用 args 设置 requirepass 适用于 $() 但不适用于 ${}

python - 从 python 代码控制本地 redis 服务器

Redis 和查询值

python - 如何从 python redis 中刷新 redis 数据库?

redis - redis中有get_next之类的东西吗?

ruby-on-rails - Redis 计数器始终关闭

node.js - Nodejs Redis HSET & HGET 插入到数据集错误

Redis:根据哈希字段值从排序集中排除值

ruby-on-rails - 这个 Rails 错误预期是什么意思?