当前位置: 首页 > 知识库问答 >
问题:

如何为redis streams定义TTL?

勾海超
2023-03-14

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

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

我的问题是如何删除不再需要的流,这取决于它们的年龄。例如,我希望删除一天前创建的流。这可能吗?

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

谢谢

共有1个答案

谷涵容
2023-03-14

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

让我们看看如何使用XTRIM

XTRIM流最大大小

XTRIM将流修剪为给定数量的项,如果需要,将旧项(ID较低的项)逐出。

您每天或定期根据删除策略生成流大小,并使用XLEN命令将其存储在某处

运行定期作业,将XTRIM称为

XTRIM x流MAXLEN~(NEW_SIZE-PREVIOUS_SIZE)

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

XTRIM x流MAXLEN~100

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

XDEL流ID[ID...]

从流中删除指定的条目,并返回删除的条目数,如果某些ID不存在,删除的条目数可能与传递给命令的ID数不同。

因此,您可以做的是,只要服务B使用事件,服务本身就可以删除流条目,因为服务B知道流ID,但这不会在您开始使用消费者组时起作用。因此,我建议使用Redis set或Redis map来跟踪确认流ID,并运行定期扫描作业来清理流。

举个例子

服务A向服务B发送ID1的流项目服务B在使用map ack_stream={ID1:true}中的项目后确认流项目,您可以跟踪其他数据,例如消费者组的计数。

扫描作业将定期运行,如每天凌晨1点,读取确认流的所有元素并过滤掉所有需要删除的项目。现在,您可以使用流ID集批量调用XDEL命令。

 类似资料:
  • 正确地注入了值。但是,变量必须是可选的,它作为命令行参数传入(然后使用SimpleCommandLinePropertySource将其添加到Spring上下文中),并且这个参数并不总是存在。 为了提供默认值,我尝试了以下两种方法: 但是在每种情况下,冒号后面的默认参数都被注入,即使存在实际值--这似乎覆盖了Spring应该注入的内容。

  • 问题内容: 我已经阅读了Java和C++之间的枚举差异问题?但是我还是很困惑。 我想以下返回相关的字符串: 据我所读,这应该是可能的。只是希望您对如何实现它有所了解。 问题答案: 简短答案 您需要一个构造函数,一个字段和一个吸气剂。 建设者 枚举类型可以具有构造函数,只要它们的访问级别为私有或默认(包私有)即可。除了枚举声明本身之外,您不能直接调用这些构造函数。与类相似,当定义不带参数的枚举常量时

  • 问题内容: 我正在尝试为Selenium编写自己的ExpectedConditions,但我不知道如何添加新的selenium。有人有例子吗?我在网上找不到任何教程。 在我目前的情况下,我想等到某个元素存在,可见,启用并且没有attr“ aria-disabled”属性。我知道这段代码行不通: 编辑:一些额外的信息:我遇到的问题是与jQuery选项卡。我在一个禁用的选项卡上有一个表单,它将在该选项

  • 我有这样的记录: 它获取default和方法。 如何调整这些方法使其具有自定义行为?假设,我想忽略方法中的。

  • 我如何实现一个重载,即当我编写的类的实例被传递到时调用它的方法? 我开始写我自己的