我在Redis中保留一个在线用户列表,其中一个键对应一个用户。密钥设置为在15分钟内超时,因此我只需要查看过去15分钟内有多少用户处于活动状态,我可以这样做:
redisCli.keys('user:*').count
问题在于密钥数量增加,在计算密钥之前获取所有密钥所花费的时间明显增加。有没有办法计算密钥而不必首先获取所有密钥?
答案 0 :(得分:2)
可以选择直接索引Set或Sorted Set中的键,即使用新的SCAN command。这取决于用例,内存/速度权衡以及所需的计数精度。
答案 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