如何为 Redis 流定义 TTL?

How to define TTL for redis streams?

我有两个微服务,我需要在它们之间实现可靠的通知。我考虑过使用 redis 流 - serviceA 将向带有标识符 X 的 serviceB 发送请求。 一旦 serviceB 完成了 serviceA 要求的工作,它将 create/add 到一个流(流特定于 X)一个新项目,让它知道它已经完成。

ServiceA可以发送多个请求,每个请求可能有不同的标识符。所以它会阻塞不同流中的新元素。

我的问题是如何根据年龄删除不再需要的流。例如,我想删除一天前创建的流。这可能吗?

如果不是,我很想听听您关于如何在 redis 中不包含不需要的流的任何想法。

谢谢

没有直接的方法来删除基于 TTL/age 的旧条目。您可以将 XTRIM/XDEL 与其他命令组合使用以 trim 流。

让我们看看如何使用XTRIM

XTRIM 流 MAXLEN ~ SIZE

XTRIM trims the stream to a given number of items, evicting older items (items with lower IDs) if needed.

您每天或根据您的删除策略定期生成流大小,并使用 XLEN 命令

将其存储在某处

运行 一个将 XTRIM 调用为

的周期性作业

XTRIM x-stream MAXLEN ~ (NEW_SIZE - PREVIOUS_SIZE)

例如,昨天的流大小是 500,现在是 600,那么我们需要删除 500 个条目,这样我们就可以 运行

XTRIM x-stream MAXLEN ~ 100

您可以使用不同的删除策略,例如每天、每周、每周两次等。


XDEL 流 ID [ID...]

Removes the specified entries from a stream, and returns the number of entries deleted, that may be different from the number of IDs passed to the command in case certain IDs do not exist.

所以您可以做的是,只要服务 B 使用事件,服务本身就可以删除流条目,因为服务 B 知道流 ID,但是一旦您开始使用使用者组,这就不会起作用。所以我会说使用 Redis set 或 Redis map 来跟踪确认流 ID 和 运行 定期清理作业来清理流。

例如

服务A发送一个ID为1的流项目给服务B 服务 B 在消费地图中的项目后确认流项目 ack_stream = { ID1: true },您可以跟踪其他数据,例如算上消费者群体。

清扫作业会 运行 像每天凌晨 1 点那样定期读取 ack_stream 的所有元素并过滤掉所有需要删除的项目。现在您可以使用一组流 ID 批量调用 XDEL 命令。