session - 具有并发用户许可的 Redis session

标签 session redis

我想使用 Redis 进行 session 。用户将存储在 Redis 中,过期时间将在每次请求时更新。我想实现并发许可。

如何计算当前存储的 key 数量?

我发现有 KEYS command但它不应该用于生产。我还考虑过 key 过期时的一些触发器,但又一次 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 作为一个非常便宜的批处理作业来完成此操作在您喜欢的任何时间间隔。

关于session - 具有并发用户许可的 Redis session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34994880/

相关文章:

Android:在 Activity 之间在远程服务器上保持 session Activity

Redis:二级索引过期

Go 和 Redisgo : DialURL error: NOAUTH Authentication required

amazon-web-services - AWS ElastiCache redis 操作需要超过 10 毫秒

laravel - laravel事件从 Controller 分派(dispatch)

python - 在 Django 中间件中设置 cookie

asp.net - 从 ASP.Net 中的 sessionID 获取 session 对象

session - Tomcat JSF session BEan @Predestroy "Session already invalidated"

ios - 如何在webobjects中获取带有sessionId的现有 session ?

node.js - 在redis中有效地缓存搜索结果