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

Redis LPOS 命令返回列表 key 中匹配给定 element 成员的索引。 默认的,当没有其它参数选项时,LPOS 从列表头部开始扫描,直到列表尾部,查找第一个与匹配"element"的成员。

如果找到匹配的成员,返回这个成员的索引(从零开计数),如果找不到匹配的成员返回 NULL。

> RPUSH mylist a b c 1 2 3 c c
> LPOS mylist c
2

带参数的命令可以有更多的功能。 LPOSRANK 选项表示返回第几个匹配的元素,即如果有列表中有多个元素匹配,那么 rank 为 1 时返回第一个匹配的元素, rank 为 2 时返回第二个匹配的元素,以此类推。

例如,在上面的例子中,成员 "c" 出现了多次,如果想返回第二个匹配的 "c" 的索引,可以也这样写:F

> LPOS mylist c RANK 2
6

第二个 "c" 的位置索引是 6。

负值 RANK 参数表示换一个搜索方向,从列表尾部想列表头部搜索。

所以,查找列中中尾部开始第一个匹配的元素命令:

> LPOS mylist c RANK -1
7

需要注意的是返回的索引还是从列表头开始,从零开始计数。无论 RANK 值正负,索引的值是固定的。

有时我们不是想返回第 N 个匹配的成员,而是想返回前 N 个匹配的成员。

可以使用LPOSCOUNT 选项。

> LPOS mylist c COUNT 2
[2,6]

我们可以组合使用 COUNTRANKCOUNT 表示返回要匹配的总数,RANK 表示从第几个匹配开始计算。

> LPOS mylist c RANK -1 COUNT 2
[7,6]

COUNT 为 0 时表示返回所有匹配成员的索引数组。

> LPOS mylist c COUNT 0
[2,6,7]

使用 COUNT 且没有匹配成员的情况下,返回空数组。没有使用 COUNT 且没有匹配成员的情况下,返回NULL。

LPOSMAXLEN 选项表示只查找最多 len 个成员。例如t MAXLEN 1000 表示之查找前 1000 个成员,这样可以提高查询效率,如果我们想在一个大的列表中,尽快找到匹配的元素,这样做效率最高。

*返回值

返回整数表示匹配元素的位置,返回null表示没有找到匹配元素。使用 COUNT 选项时返回数据(空数组表示无匹配)。

*例子

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>