列表位置
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
- 可用时间
- 6.0.6
- 时间复杂度
- O(N),其中 N 是列表中的元素数量,对于平均情况而言。当搜索列表头或尾部的元素时,或者当提供 MAXLEN 选项时,命令可能在恒定时间内运行。
- ACL 类别
-
@read
,@list
,@slow
,
该命令返回 Redis 列表中匹配元素的索引。默认情况下,当没有给出任何选项时,它将从头到尾扫描列表,查找“元素”的第一个匹配项。如果找到元素,则返回其索引(列表中从零开始的位置)。否则,如果没有找到匹配项,则返回 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
将尝试返回最多指定数量的匹配项,但从第 N 个匹配项开始,如 RANK
选项指定的那样。
> 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
选项更好,因为它更通用。
示例
RESP2 响应
以下任一
RESP3 响应
以下任一