【发布时间】:2016-01-26 09:38:48
【问题描述】:
我想使用 Redis 进行会话。用户将存储在 Redis 中,过期时间将在每次请求时更新。我想实现并发许可。
如何计算当前存储的密钥数量?
我发现有KEYS command,但它不应该用于生产。我还考虑了密钥过期时的一些触发器,但又是it's not what I should rely on。
如何使用 Redis 实现并发用户许可?
【问题讨论】:
我想使用 Redis 进行会话。用户将存储在 Redis 中,过期时间将在每次请求时更新。我想实现并发许可。
如何计算当前存储的密钥数量?
我发现有KEYS command,但它不应该用于生产。我还考虑了密钥过期时的一些触发器,但又是it's not what I should rely on。
如何使用 Redis 实现并发用户许可?
【问题讨论】:
这对于 EXPIRE 或 Redis 的顶级键不是很好用。如果你想在 Redis 中存储其他任何东西,它会打乱你的逻辑。此外,尽管您可以使用DBSIZE、it may be inaccurate because Redis does not actively expire items 之类的命令来计算键的总数。在我的印象中,Redis 的构建使得顶层键的确切数量不应该是重要的。
对于键的确切数量很重要的情况,Redis 有一些很棒的数据结构可供您使用。在您的情况下,我建议使用sorted set,其中键是 user_id,分数是 Unix 时间的到期日期。这看起来像:
ZADD users_set 1453771862 "user1"
ZADD users_set 1453771563 "user2"
ZADD users_set 1453779999 "user3"
然后,任何时候你需要知道有多少当前用户,你可以对所有高于当前时间的过期时间做一个ZCOUNT:
ZCOUNT users_set 1453771850
>>> 2
ZADD 操作是幂等的,因此您还可以轻松地为用户添加/更新过期时间:
ZADD users_set 1453779999 "user2"
ZCOUNT users_set 1453771850
>>> 3
这样,您每次执行ZCOUNT 时都可以获得相关用户的准确计数,并且您执行的每个操作都是相对便宜的 O(log(n))。
最后,如果从排序集中删除/过期用户对您来说很重要,您可以使用 ZREMRANGEBYRANK 在任何您喜欢的时间间隔将其作为一个非常便宜的批处理作业来完成。
【讨论】: