2

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

4

2 回答 2

3

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

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

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

更新

从 Redis 6.2 开始,XTRIM支持一种新的修剪策略:MINID. 使用此策略,Redis 将驱逐 id 低于给定的条目threshold

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

于 2020-04-02T05:30:08.850 回答
3

从 Redis 6.2 开始,这是可能的。

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

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

于 2021-06-25T14:41:11.940 回答