LPOS
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
- 可用版本
- Redis Open Source 6.0.6
- 时间复杂度
- 平均情况下,O(N),其中 N 是列表中元素的数量。当搜索靠近列表头部或尾部的元素时,或提供了 MAXLEN 选项时,命令可能在常数时间内运行。
- ACL 类别
-
@read
,@list
,@slow
,
该命令返回 Redis 列表中匹配元素的索引。默认情况下,未提供选项时,它会从列表头部扫描到尾部,查找“element”的第一个匹配项。如果找到该元素,则返回其索引(在列表中的零基位置)。否则,如果没有找到匹配项,则返回 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
选项更好,因为它更通用。
示例
RESP2 回复
以下任意一种
- Nil 回复:如果没有匹配的元素。
- Integer 回复:表示匹配元素的整数。
- Array 回复:如果提供了 COUNT 选项,则返回一个表示匹配元素的整数数组(如果没有匹配项,则返回空数组)。
RESP3 回复
以下任意一种
- Null 回复:如果没有匹配的元素。
- Integer 回复:表示匹配元素的整数。
- Array 回复:如果提供了 COUNT 选项,则返回一个表示匹配元素的整数数组(如果没有匹配项,则返回空数组)。