LPOS 是什么
LPOS 在列表中按值查找元素下标,支持 RANK 指定要找第几个匹配(负数从右往左数),COUNT 指定一次返回多少个位置(0 表示返回全部)。它让「值在哪个位置」这件事不必拉到客户端遍历。6.0.6 起才提供该命令,复杂度是 O(N):列表越长扫描越慢,且没有索引可用,高频查找场景不适合直接依赖它。
基本信息
| 语法 | LPOS key element [RANK rank] [COUNT num] [MAXLEN len] |
|---|---|
| 版本 | 6.0.6 起提供 |
| RANK | 第几个匹配,默认 1;负数表示从右往左数 |
| COUNT | 返回多个位置,0 表示返回全部匹配 |
| 复杂度 | O(N),列表长度决定扫描成本 |
典型使用场景
- 定位元素位置:确认某条记录在队列中的相对位置,判断积压程度
- 重复元素统计:用 COUNT 0 取出所有匹配位置,分析重复写入
- 从右查找:用负 RANK 找最近写入的那一条,近似查看队列尾部状态
- 数据核查:确认某任务是否还在队列里、是否出现重复
- 小列表检索:元素数量不大时用它替代客户端遍历,减少数据传输
用法示例
用法示例
RPUSH q a b a c a
LPOS q a # 0:第一个匹配的下标
LPOS q a RANK 2 # 2:第二处匹配
LPOS q a RANK -1 # 4:从右往左第一处
LPOS q a COUNT 0 # 返回全部位置:0 2 4
LPOS q z # nil:不存在该元素
LRANGE q 0 -1 # 列表全貌,便于核对下标含义选项读法
| 选项 | 含义 | 注意 |
|---|---|---|
| RANK n | 第 n 个匹配,默认 1 | 负数从右往左数,语义容易记反 |
| COUNT m | 返回最多 m 个位置 | 0 表示不限,返回全部匹配位置 |
| MAXLEN | 最多扫描多少个元素后停止 | 限制扫描范围可缓解大列表开销 |
| 返回 nil | 未找到该元素 | 必须处理空返回 |
COUNT 0 会扫描整个列表:列表很长时开销可观。只需判断存在性时用不带 COUNT 的形式,扫到第一个匹配就返回。
LPOS 只反映当前时刻的下标:列表在头尾被修改后下标立刻变化,不要把返回值当作稳定标识长期缓存。