XTRIM

用法
XTRIM key 〈 MAXLEN | MINID 〉 [ = | ~ ] threshold [ LIMIT count ]
复杂度
O(N),其中 N 为被逐出条目的数量。然而,常数时间非常小,因为条目被组织在包含多个条目的宏节点中,可以通过一次解除分配来释放。
5.0.0
ACL 类别
@stream, @write, @slow

XTRIM 根据需要,通过逐出较旧的条目(ID 较低的条目)来修剪流。

修剪流可以通过以下策略之一完成

  • MAXLEN:当流的长度超过指定的 thresholdthreshold 是一个正整数)时,逐出条目。
  • MINID:逐出 ID 低于 threshold 的条目,其中 threshold 是一个流 ID。

例如,这将把流精确地修剪到最新的 1000 个项目

XTRIM mystream MAXLEN 1000

而在本例中,所有 ID 低于 649085820-0 的条目都将被逐出

XTRIM mystream MINID 649085820

默认情况下,或者当提供了可选的 = 参数时,该命令执行精确修剪。

根据策略,精确修剪意味着

  • MAXLEN:修剪后的流的长度将恰好是其原始长度和指定的 threshold 之间的最小值。
  • MINID:流中最旧的 ID 将恰好是其原始最旧 ID 和指定的 threshold 之间的最大值。

近似精确修剪

由于精确修剪可能需要 Valkey 服务器付出额外努力,因此可以提供可选的 ~ 参数以提高效率。

例如

XTRIM mystream MAXLEN ~ 1000

MAXLEN 策略和 threshold 之间的 ~ 参数意味着用户请求修剪流,使其长度至少达到 threshold,但也可能略多。在这种情况下,当可以获得性能提升时(例如,当数据结构中的整个宏节点无法被移除时),Valkey 将提前停止修剪。这使得修剪效率更高,通常也是您想要的结果,尽管修剪后,流中可能会比 threshold 多出几十个额外条目。

在使用 ~ 时,控制命令工作量的另一种方式是 LIMIT 子句。使用时,它指定将被逐出的最大条目 count。当未指定 LIMITcount 时,默认值将隐式地使用 100 * 宏节点中的条目数作为 count。将 count 指定为 0 会完全禁用限制机制。

示例

127.0.0.1:6379> XADD mystream * field1 A field2 B field3 C field4 D
"1714701492231-0"
127.0.0.1:6379> XTRIM mystream MAXLEN 2
(integer) 0
127.0.0.1:6379> XRANGE mystream - +
1) 1) "1714701492231-0"
   2) 1) "field1"
      2) "A"
      3) "field2"
      4) "B"
      5) "field3"
      6) "C"
      7) "field4"
      8) "D"

RESP2/RESP3 回复

整数回复:从流中删除的条目数量。

历史

版本 变更
6.2.0

添加了 MINID 修剪策略和 LIMIT 选项。