使Redis缓存ZADD中的特定密钥过期,以将数据插入到缓存中

时间:2019-12-12 04:55:29

标签: redis

我正在为我的项目使用Redis 5,根据我的要求,我已使用ZADD以设备ID {Timestamp:Value}的格式存储数据。我只需要将数据存储2周,之后我就希望数据从缓存中过期。是否可以自动删除超过2周的密钥,还是应该使用单独的监视器使用ZREMRANGE删除密钥?

2 个答案:

答案 0 :(得分:0)

否,您不必手动进行。 Redis将处理该问题。

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

EXPIRE my_lovely_key 60

my_lovely_key的有效期限为 60秒

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

TTL my_lovely_key

答案 1 :(得分:0)

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。完全推荐。