【问题标题】:Redis list with expiring entries?带有过期条目的 Redis 列表?
【发布时间】:2018-06-11 04:48:05
【问题描述】:

我正在寻找一种为用户存储项目列表的方法,该列表将在 24 小时内过期。有没有办法使用 Redis 来实现这一点?我正在考虑只使用列表并为每个单独的项目设置过期时间,有没有更好的方法?

【问题讨论】:

  • 这将是 Redis 中的一个很好的功能。

标签: caching redis


【解决方案1】:

正如接受的答案中所述,Redis 中的过期仅在键级别执行 - 嵌套元素不能过期。

要实现具有过期元素的列表,您可以使用 Sorted Set 数据结构。每个成员的分数都应该是当前纪元,因此您将保留插入顺序。如果值(成员)不是唯一的,请通过连接 epoch 来使它们唯一,例如:

ZADD user1:items 1514822755 1514822755:value
ZADD user1:items 1514822758 1514822758:value

要“过期”项目,请从 -inf 和当前纪元减去 24 小时调用 ZREMRANGEBYSCORE

【讨论】:

  • 如果元素不应该在 24 小时后全部过期,而是在不同的时间间隔内过期,则可以将分数定义为过期时间戳,因此从 -inf 和现在调用 ZREMRANGEBYSCORE。广告订单将不再受到尊重
【解决方案2】:

不,您不能为 LIST 中的每个项目设置过期时间。您只能为整个 LIST 设置过期时间。

为了实现你想要的,你需要为每一个item拥有一个key:

SET user1:item1 value EX 86400
SET uesr1:iter2 value EX 86400
SET user2:item1 value EX 86400

要获取指定用户的所有项目,可以使用带有模式的SCAN命令(或使用Keyspace Notification以获得更好的性能,但工作更复杂):

SCAN 0 MATCH user1:*

【讨论】:

  • 请注意 SCAN 并不总是保证返回请求的项目数。否则此解决方案有效。
  • @itamarhaber 的回应很到位。 ZADD 和 ZREMRANGEBYSCORE 非常适合以纪元日期为分数
  • @vladaman 我不明白你的建议。文档redis.io/commands/scan 说了一些我不清楚的东西。请您深入探讨一下。也许是一个例子?
猜你喜欢
  • 2012-04-07
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2011-08-25
  • 2011-11-22
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多