*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 和索引名。但需注意并发读取和删除的竞态条件。