LPOS

返回列表中匹配元素的索引。

语法

LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]

引入版本:6.0.6

复杂度摘要:O(N)

该命令返回 Redis 列表中匹配元素的索引。默认情况下,当没有给出任何选项时,它将从头到尾扫描列表,寻找 element 的第一个匹配项。如果找到 element,则返回其索引(列表中从零开始的位置)。否则,如果未找到匹配项,则返回 nil。

必需参数

key

保存列表的键的名称。

element

要搜索的值。

可选参数

RANK rank

返回的第一个匹配的排名:1 是从头部开始的第一个匹配,-1 是从尾部开始的第一个匹配。

COUNT num-matches

返回的匹配数。 0 返回所有匹配项。

MAXLEN len

最多比较 len 个元素。 0(默认)扫描整个列表。

详细说明

可选参数和选项可以修改命令的行为。 RANK 选项指定当存在多个匹配项时要返回的第一个元素的排名。等级 1 表示返回第一个匹配项,2 表示返回第二个匹配项,依此类推。

在上面的示例中,元素 c 出现了多次。如果您想要第二场比赛的索引,请编写:

> RPUSH mylist a b c 1 2 3 c 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 选项更好,因为它更通用。

示例

redis> RPUSH mylist a b c d 1 2 3 4 3 3 3
(integer) 11
redis> LPOS mylist 3
(integer) 6
redis> LPOS mylist 3 COUNT 0 RANK 2
1) (integer) 8
2) (integer) 9
3) (integer) 10

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

以下任意一项: * 无回复:如果没有匹配元素。 * 整数回复:代表匹配元素的整数。 * 数组回复:如果给出了 COUNT 选项,则表示匹配元素的整数数组(如果没有匹配则为空数组)。

RESP3

以下任意一项: * 空回复:如果没有匹配元素。 * 整数回复:代表匹配元素的整数。 * 数组回复:如果给出了 COUNT 选项,则表示匹配元素的整数数组(如果没有匹配则为空数组)。

资料来源:Redis 官方 LPOS 文档;中文内容参考 Redis 文档许可。