计算redis密钥而不在Ruby中获取它们

时间:2014-05-18 06:20:56

标签: ruby count redis

我在Redis中保留一个在线用户列表,其中一个键对应一个用户。密钥设置为在15分钟内超时,因此我只需要查看过去15分钟内有多少用户处于活动状态,我可以这样做:

redisCli.keys('user:*').count

问题在于密钥数量增加,在计算密钥之前获取所有密钥所花费的时间明显增加。有没有办法计算密钥而不必首先获取所有密钥?

2 个答案:

答案 0 :(得分:2)

可以选择直接索引Set或Sorted Set中的键,即使用新的SCAN command。这取决于用例,内存/速度权衡以及所需的计数精度。

另一种选择是您使用Redis HyperLogLogs,请参阅PFADDPFCOUNT

答案 1 :(得分:1)

Redis没有用于仅计算具有特定模式的密钥的API,因此它在ruby客户端中也不可用。

我可以建议使用另一个数据结构来读取用户数。

例如,您可以使用redis的SortedSet,您可以将每个用户的最后一个TTL设置的时间戳设置为score,然后您可以调用zcount获取当前活跃用户数:

redisCli.zcount('active_users', 15.minutes.ago.to_i, Time.now.to_i)

您需要不时通过以下方式清理旧值:

redisCli.zremrangebyscore 'active_users', 0, 15.minutes.ago.to_i