LPOS
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
- Available since:
- 6.0.6
- Time complexity:
- O(N) where N is the number of elements in the list, for the average case. When searching for elements near the head or the tail of the list, or when the MAXLEN option is provided, the command may run in constant time.
- ACL categories:
-
@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" 作为 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 reply: 如果没有匹配的元素。
- Integer reply: 一个表示匹配元素的整数。
- Array reply: 如果给出了COUNT选项,则返回一个表示匹配元素的整数数组(如果没有匹配项,则返回一个空数组)。
RESP3 回复
以下任意一项:
- Null reply: 如果没有匹配的元素。
- Integer reply: 一个表示匹配元素的整数。
- Array reply: 如果给出了COUNT选项,则返回一个表示匹配元素的整数数组(如果没有匹配项,则返回空数组)。