- 用法
-
LPOS key element [ RANK rank ] [ COUNT num-matches ] [ MAXLEN len ]
- 复杂度
- O(N),N 为列表中元素的数量(平均情况)。当搜索列表中靠近头部或尾部的元素时,或当提供了 MAXLEN 选项时,该命令可能以常数时间运行。
- 起始版本
- 6.0.6
- ACL 类别
- @list, @read, @slow
此命令返回列表中匹配元素的索引。默认情况下,未提供任何选项时,它将从列表的头部扫描到尾部,查找第一个匹配的“元素”。如果找到该元素,则返回其索引(列表中从零开始的位置)。否则,如果没有找到匹配项,则返回 nil
。
> RPUSH mylist a b c 1 2 3 c c
> LPOS mylist c
2
可选参数和选项可以修改命令的行为。RANK
选项指定在存在多个匹配项时,要返回的第一个元素的“排名”。排名为 1 表示返回第一个匹配项,2 表示返回第二个匹配项,依此类推。
例如,在上面的示例中,元素“c”出现多次,如果我想要第二个匹配项的索引,我会这样写
> LPOS mylist c RANK 2
6
也就是说,“c”的第二个出现位置在第 6 位。作为 RANK
参数的负“排名”告诉 LPOS
反转搜索方向,从尾部到头部开始搜索。
因此,我们想说,给我从列表尾部开始的第一个元素
> LPOS mylist c RANK -1
7
请注意,索引仍然以“自然”方式报告,即从列表头部开始的第一个元素为索引 0,下一个元素为索引 1,依此类推。这基本上意味着无论排名是正数还是负数,返回的索引都是稳定的。
有时我们不仅想返回第 N 个匹配元素,还想返回所有前 N 个匹配元素的位置。这可以通过使用 COUNT
选项来实现。
> LPOS mylist c COUNT 2
[2,6]
我们可以结合使用 COUNT
和 RANK
,这样 COUNT
将尝试返回指定数量的匹配项,但从 RANK
选项指定的第 N 个匹配项开始。
> LPOS mylist c RANK -1 COUNT 2
[7,6]
使用 COUNT
时,可以将匹配数指定为 0,以此告诉命令我们希望将所有找到的匹配项作为索引数组返回。这比提供一个非常大的 COUNT
选项更好,因为它更通用。
> LPOS mylist c COUNT 0
[2,6,7]
当使用 COUNT
且未找到匹配项时,返回一个空数组。但当未使用 COUNT
且没有匹配项时,命令返回 nil
。
最后,MAXLEN
选项告诉命令仅将提供的元素与给定最大数量的列表项进行比较。例如,指定 MAXLEN 1000
将确保命令只执行 1000 次比较,有效地在列表的一个子集上运行算法(根据我们使用正排名还是负排名,可能是前半部分或后半部分)。这有助于限制命令的最大复杂度。当预期匹配项会很快找到时,此选项也很有用,但为了确保在情况并非如此时,命令不会花费太多时间运行。
使用 MAXLEN
时,可以将最大比较次数指定为 0,以此告诉命令我们希望进行无限次比较。这比提供一个非常大的 MAXLEN
选项更好,因为它更通用。
示例
127.0.0.1:6379> RPUSH mylist a b c d 1 2 3 4 3 3 3
(integer) 11
127.0.0.1:6379> LPOS mylist 3
(integer) 6
127.0.0.1:6379> LPOS mylist 3 COUNT 0 RANK 2
1) (integer) 8
2) (integer) 9
3) (integer) 10
RESP2 回复
以下任意一种
RESP3 回复
以下任意一种