【问题标题】:Tracking online users using Redis使用 Redis 跟踪在线用户
【发布时间】:2014-02-21 05:25:32
【问题描述】:

我想跟踪有多少用户在线,我使用 Redis 来解决这个问题,因为一个或多个应用程序实例访问此缓存以显示状态。每次新登录时,Redis 都会使用用户 ID、键“online_users”更新,并且每次注销时都会删除用户。这种方法是否正确,如果不是如何构造它以获得最佳性能和有点大的数据集?

"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?问题的答案比较了两种方法,但提到的第一个链接不可用,所以我无法理解其他上下文。

【问题讨论】:

    标签: redis


    【解决方案1】:

    如果你只想知道:

    1- 有多少用户在线

    2- 哪些用户在线

    3- 查找给定用户是否在线

    并且您可以确保您可以跟踪 EVERY 注销和 ALL 用户调用注销请求,然后您可以使用 set 并将用户 ID 存储到其中当用户登录并在用户注销时删除用户标识(与您描述的方法相同)。

    例子:

    • user_a 登录:

    > 伤心 online_users user_a

    (整数)1

    • user_b 登录:

    > 伤心 online_users user_b

    (整数)1

    • 有多少用户在线?

    > 伤痕累累的在线用户

    (整数)2

    • user_a 在线吗?

    > sismember online_users user_a

    (整数)1

    • user_a 退出:

    > srem online_users user_a

    (整数)1

    • 哪些用户在线?

    > smembers online_users

    1) “用户_b”

    所有这些操作都是 O(1),除了 smembers 是 O(N),您唯一关心和限制的是用于存储这些数据的内存。提示是尝试为您的用户使用较小的密钥,如果您不能,Redis 已经压缩了它们。

    如果您无法确保跟踪注销,可以使用问题“使用 Redis 跟踪在线用户的两种方法。哪种方法更快?”的第二种方法。

    要使用这种方法,您需要跟踪用户的所有事件(不仅是登录),并使用时间戳将用户 ID 存储在不同的键上,例如:online_users_2014-02-20_10-01(在线用户位于2014 年 2 月 20 日 10:01)。

    要回答当前有多少用户在线,您可以说,例如,如果某个用户在过去 3 分钟内至少发送了一个事件,则该用户被视为在线。然后计算最后 3 组的并集,并在结果集上使用 scard 来查找在线用户数。

    这种方法要昂贵得多,因为sunion 是 O(N)。在您的密钥上添加超时(使用expire 命令)以帮助清理您的内存是一个好主意。

    基于最后一种方法的另一种方法是在客户端添加一些逻辑,每分钟在后台为您的后端发送一个 PING 事件,然后您可以跟踪此事件,并且您将确保其中的用户设置在线。

    【讨论】:

    • 这个方法很好,我会实现这个方法并大批量测试性能。
    【解决方案2】:

    1)

    就性能和使用的内存而言,我认为最好的方法是使用bitset 结构,这样,每个用户都表示为一个位,Redis 有很多命令(setbit、bitcount、bitop、getbit ) 来使用这个结构。

    使用这种方法的唯一要求是您需要为每个用户提供一个唯一的顺序 ID。

    例子:

    1 - 用户 43 登录

    > setbit online_users 43 1

    (整数)0

    2 - 用户 57 登录

    > setbit online_users 57 1

    (整数)0

    3 - 在线用户总数

    > bitcount online_users

    (整数)2

    4 - 用户 43 退出

    > setbit online_users 43 0

    (整数)1

    5 - 在线用户总数

    > bitcount online_users

    (整数)1

    6 - 检查用户 57 是否在线

    > getbit online_users 57

    (整数)1

    2) 可以在您的用户结构中设置一个新属性来跟踪用户状态,但直接检查 online_users 位集中的该值可能更容易(使用 getbit 命令)。

    3) 可以找到第一个链接的缓存版本here

    在内存和性能方面,使用 bitset 比其他问题的方法更好。

    顺便说一句,我不会使用使用KEYS 命令的方法,因为当数据集很大时它可能会成为瓶颈。

    你可以在 BITCOUNT Redis 命令的文档页面上找到我关于这种方法的信息。

    【讨论】:

    • 您规定的方法很好,但我只有用户的文本 ID,而不是数字 ID。所以,setbit online_users xxxx123 1 抛出错误。更何况,如何在线查找用户列表?
    • 您确实需要为每个用户提供唯一的顺序 ID 才能使用这种方法。
    • 您确实需要为每个用户提供唯一的顺序 id 才能使用这种方法,并且确定在线用户列表的成本很高,但检查给定用户是否在线很简单。在你的问题中,你说你想跟踪有多少用户在线,但我会发布另一个解决方案来让你跟踪在线用户。
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-07-19
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2012-03-28
    相关资源
    最近更新 更多