我正在为我的项目使用Redis 5,根据我的要求,我已使用ZADD以设备ID {Timestamp:Value}的格式存储数据。我只需要将数据存储2周,之后我就希望数据从缓存中过期。是否可以自动删除超过2周的密钥,还是应该使用单独的监视器使用ZREMRANGE删除密钥?
答案 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。
缺点:
但是您可以通过使用日期分区来克服这些问题。流具有如此高的内存效率,您每周可以使用一个流,并且有2-3个流处于活动状态,仅附加到最新流,并相应地为每个流设置EXPIRE
。