Redis 流 - 根据时间删除/过期事件

Ram*_*ash 4 redis redis-streams

我正在玩redis流,到目前为止还不错。我试图了解是否有办法根据时间或其他方式使旧事件过期。我知道我们可以通过事件 ID 删除。但我不想记住/存储事件 ID,这很困难。相反,我正在寻找一种方法来删除最后 10K 事件或类似的事件。

rjh*_*rjh 9

从 Redis 6.2 开始这是可能的。

如果您使用默认事件 ID(通过*作为 ID 传递给XADD),它们将以插入事件时的 UNIX 时间戳开头,后跟破折号。

然后您可以使用XTRIM $stream_name MINID $timestamp删除所有 ID 低于 '$timestamp' 的事件,这相当于所有早于时间戳的事件。


for*_*ack 6

到目前为止,还没有办法按时间使事件过期。相反,唯一的过期策略是通过保留最新的 N 个事件来使事件过期。您可以使用XTRIM 命令逐出旧事件。

我应该经常这样做吗?可以将流配置为保留最后 N 个事件吗?

如果您想始终保留最新的 N 个事件,可以调用XADD 命令MAXLEN选择获取上限流。此外,通过~选项,您可以获得更好的性能,但不准确地使事件过期。检查文档了解详细信息。

更新

从 Redis 6.2 开始,XTRIM支持新的修剪策略:MINID。通过这种策略,Redis 将驱逐 id 低于给定的条目threshold

因此,如果您使用时间戳作为条目ID,例如默认自动生成的ID使用Unix时间戳(以毫秒为单位)作为ID的一部分,您可以使用此策略根据时间使事件过期,即删除早于给定时间戳的事件。