没有直接的方法可以根据 TTL/年龄删除旧条目。您可以将XTRIM/XDEL 与其他命令结合使用来修剪流。
让我们看看如何使用XTRIM
XTRIM 流 MAXLEN ~ SIZE
XTRIM 将流修剪为给定数量的项目,并在需要时驱逐较旧的项目(ID 较低的项目)。
您每天或定期根据您的删除策略生成流大小,并使用XLEN 命令将其存储在某处
运行将 XTRIM 调用为的定期作业
XTRIM x-stream MAXLEN ~ (NEW_SIZE - PREVIOUS_SIZE)
例如,昨天流大小是 500 现在是 600,那么我们需要删除 500 个条目以便我们可以运行
XTRIM x-stream MAXLEN ~ 100
您可以使用不同的策略进行删除,例如每天、每周、每周两次等。
XDEL 流 ID [ID...]
从流中删除指定的条目,并返回删除的条目数,如果某些 ID 不存在,这可能与传递给命令的 ID 数不同。
因此,您可以做的是,只要服务 B 使用事件,服务本身就可以删除流条目,因为服务 B 知道流 ID,但是一旦您开始使用使用者组,这将不起作用。所以我会说使用 Redis set 或 Redis map 来跟踪确认流 id 并运行定期扫描作业来清理流。
例如
服务 A 向服务 B 发送 ID 为 1 的流项目
服务 B 在消费地图中的项目后确认流项目
ack_stream = { ID1: true },您可以跟踪其他数据,例如在消费组的情况下计算。
扫描作业将定期运行,例如每天凌晨 1 点,它读取 ack_stream 的所有元素并过滤掉所有需要删除的项目。现在您可以使用一组流 id 批量调用 XDEL 命令。