LPOS

用法
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]

我们可以结合使用 COUNTRANK,这样 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 回复

以下任意一种

  • 空回复:如果没有匹配元素。

  • 整数回复:表示匹配元素的整数。

  • 数组回复:如果提供了 COUNT 选项,则返回一个表示匹配元素的整数数组(如果没有匹配项,则返回空数组)。

RESP3 回复

以下任意一种

  • Null 回复:如果没有匹配元素。

  • 整数回复:表示匹配元素的整数。

  • 数组回复:如果提供了 COUNT 选项,则返回一个表示匹配元素的整数数组(如果没有匹配项,则返回空数组)。