使 Redis 缓存中的特定键过期,ZADD 用于将数据插入缓存



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

不,您不必手动操作。Redis将处理这个问题。

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

EXPIRE my_lovely_key 60

my_lovely_key60 秒后过期。

您可以像这样获取密钥的 TTL:

TTL my_lovely_key

Redis 自动删除超过 2 周的密钥的唯一方法是使整个密钥过期,即您案例中的整个排序集。

如果你想自动解决它,那么你将不得不使用多个键,按日期对数据进行分区,以便你可以相应地过期。例如,您可以每天创建一个排序集。

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

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

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

您可以每天、每小时或每周使用密钥,您的呼叫。

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

瑞迪斯流

听起来你的用例与遥测相关,就像检测信号(仅追加(。看看 Redis Streams。

您可以让 Redis 服务器在 ID 中为您设置时间戳。它将为您的内存效率创造奇迹:项目作为增量压缩宏节点存储在基数树中,同字段压缩和编码为二进制的整数。Antirez 声称内存效率是 13 倍。

缺点:

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

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

看看 Redis 大学的 Redis Streams 课程。完全推荐。

最新更新