【问题标题】:How to define TTL for redis streams?如何为redis流定义TTL?
【发布时间】:2020-08-05 07:52:46
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: redis redis-streams


    【解决方案1】:

    没有直接的方法可以根据 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 命令。

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2023-03-22
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2018-11-30
      • 2021-10-18
      相关资源
      最近更新 更多