【问题标题】:Expire specific key in Redis Cache, ZADD for inserting data to cache过期 Redis 缓存中的特定键,ZADD 用于将数据插入缓存
【发布时间】:2020-04-05 10:52:02
【问题描述】:

我在我的项目中使用 Redis 5,根据我的要求,我使用 ZADD 以设备 ID {Timestamp : Value} 格式存储数据。我只需将数据存储 2 周时间,之后我希望数据从缓存中过期。有没有办法自动删除超过 2 周的密钥,或者我应该使用单独的监视器使用 ZREMRANGE 删除密钥?

【问题讨论】:

  • 过期仅在关键级别由 Redis 管理 - 要使嵌套类型(例如 zsets)的部分内容过期,您需要使用 ZREMRANGE 或类似方法实现自己的逻辑。

标签: redis


【解决方案1】:

不,您不必手动输入。 Redis 会处理这个问题。

您可以使用 EXPIRE 命令设置和更新密钥的过期时间。 示例:

EXPIRE my_lovely_key 60

my_lovely_key 在 60 秒后过期

你可以这样获取key的TTL:

TTL my_lovely_key

【讨论】:

  • 这将使整个密钥过期,我不希望这样,我希望删除时间戳超过 2 周的特定密钥。我已经在问题描述中提到了我如何存储数据集。
  • 不,我认为您不能为列表中的项目设置过期时间。您应该手动处理它,但 ZREMRANGE 不是必需的。您可以在获得该项目后使用时间戳(您已经从密钥中知道它)来计算项目的生命周期。如果生命周期超过 2 周,您可以删除密钥并停止进程(或任何东西)。如果您担心 RAM 的使用,也有解决方案。
【解决方案2】:

Redis 自动删除超过 2 周的键的唯一方法是使整个键过期,在您的情况下是整个排序集。

如果您想自动解决问题,则必须使用多个密钥,按日期对数据进行分区,以便相应地过期。例如,您可以每天创建一个排序集。

ZADD mySortedSet:2019-12-12 10 "Device ID {Timestamp : Value}"
EXPIREAT mySortedSet:2019-12-12 1577372410

EXPIREAT 使用 Unix 时间戳。或者使用 EXPIRE 和 1209600 秒(两周)。

这样,您始终拥有 14-15 个密钥,最旧的密钥会自动过期。您可以使用 ZUNIONSTORE 或 ZINTERSTORE 对所有这些进行操作。

您可以每天、每小时或每周使用一个键来通话。

正如 Itamar 所指出的,不支持使一个键的部分内容(例如来自排序集)过期,您需要实现自己的逻辑。您必须选择更简单且最适合您的用例的方法:按日期对键进行分区以自动过期,或实现您自己的 ZREMRANGE 逻辑。

Redis 流

听起来您的用例与遥测相关,例如心跳(仅附加)。看看Redis Streams

您可以让 Redis 服务器在 ID 中为您设置时间戳。它将对您的内存效率产生奇迹:项目以 delta 压缩宏节点、相同字段压缩和整数编码为二进制的形式存储在基数树中。 Antirez claims 13x memory efficiency

缺点:

  • 您只能使用 XTRIM 按数量修剪。
  • 您必须实现自己的过期逻辑。

但是您可以通过使用日期分区来克服这些问题。流非常节省内存,您每周可以使用一个流,并且直播 2-3 个流,仅附加到最新的流,相应地为每个流设置 EXPIRE

看看Redis Streams course from Redis University。完全推荐。

【讨论】:

  • @LeoMurilo 那很详细。现在我无法更改存储在缓存中的数据类型,因此我将研究通过其他方式使密钥过期的其他措施。
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多