*Redis FT.CURSOR-READ 命令

FT.CURSOR-READ 从 RediSearch 聚合查询游标中读取下一批结果。


*语法

FT.CURSOR-READ index cursor_id [COUNT count]

*参数说明

参数 类型 必填 说明
index String 索引名称(或别名)
cursor_id Integer 游标 ID
COUNT Integer 本次读取的最大结果数

*返回值

  • Array:聚合结果数组。若游标耗尽,返回结果后游标 ID 为 0
  • Error:游标不存在或已过期

*时间复杂度

取决于读取的数据量。O(N),N 为读取的结果数。


*示例

*创建游标并读取

> FT.AGGREGATE idx:products "*" WITHCURSOR COUNT 2
1) 1) "name"
   2) "product1"
   3) "name"
   4) "product2"
2) (integer) 42
> FT.CURSOR-READ idx:products 42 COUNT 2
1) 1) "name"
   2) "product3"
   3) "name"
   4) "product4"
2) (integer) 42
> FT.CURSOR-READ idx:products 42 COUNT 2
1) 1) "name"
   2) "product5"
2) (integer) 0

*读取剩余全部

> FT.CURSOR-READ idx:articles 10
1) 1) "title"
   2) "article1"
2) (integer) 0

*常见错误

错误 原因 解决
Cursor not found 游标 ID 错误或已过期 确认游标 ID,检查超时时间

*最佳实践

  • 使用游标处理大数据量聚合,避免单次返回过多数据
  • 循环调用 CURSOR-READ 直到游标 ID 返回 0
  • 异常退出时调用 FT.CURSOR-DEL 释放游标
  • 适当设置 COUNT 平衡网络往返和内存占用

*FAQ

Q1: 游标读取是阻塞的吗? A: 是阻塞读取,但读取的数据量可控(COUNT),不会造成长时间阻塞。

Q2: COUNT 和创建游标时的 COUNT 有什么关系? A: 创建时的 COUNT 是初始读取数量;CURSOR-READ 的 COUNT 覆盖本次读取数量。

Q3: 游标读取期间数据变更会影响结果吗? A: 游标快照基于创建时的数据状态,后续写入/更新不会出现在结果中。

Q4: 可以多个客户端共享游标吗? A: 可以,只要知道游标 ID 和索引名。但需注意并发读取和删除的竞态条件。