# List命令

# BLMOVE

# 语法

BLMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT> timeout

# 描述

BLMOVE 是 LMOVE 的阻塞版本。当源列表中包含元素时,这个命令的行为与 LMOVE 完全相同

# 参数

  • key

键名

  • destination

目标列表的键

  • LEFT | RIGHT

从源列表的哪一端弹出元素:LEFT(头部)或 RIGHT(尾部)

  • timeout

最大阻塞时间,单位为秒。如果超时时间设置为 0,则表示无限期阻塞


# BLMPOP

# 语法

BLMPOP timeout numkeys key [key ...] <LEFT | RIGHT> [COUNT count]

# 描述

只要有任何一个列表中包含元素,这个命令的行为就与 LMPOP 完全相同。当在 MULTI/EXEC 事务块或 Lua 脚本中使用时,它的行为也与 LMPOP 完全相同

# 参数

  • key

键名

  • numkey

后面跟随的键的数量

  • timeout

最大阻塞时间,单位为秒。如果超时时间设置为 0,则表示无限期阻塞

  • COUNT

要弹出的元素数量。默认值为 1

  • LEFT | RIGHT

从源列表的哪一端弹出元素:LEFT(头部)或 RIGHT(尾部)


# BLPOP

# 语法

BLPOP key [key ...] timeout

# 描述

BLPOP 是一个阻塞式列表弹出的基础命令。当给定的所有列表里都没有元素可以弹出时,它会直接阻塞当前的连接

# 参数

  • key

键名

  • timeout

最大阻塞时间,单位为秒。如果超时时间设置为 0,则表示无限期阻塞

# 示例

> DEL list1 list2
(integer) 0
> RPUSH list1 a b c
(integer) 3
> BLPOP list1 list2 0
1) "list1"
2) "a"

BLPOP list1 list2 list3 0

# BRPOP

# 语法

BRPOP key [key ...] timeout

# 描述

BRPOP 是一个阻塞式列表弹出的基础命令。它是 RPOP 的阻塞版本:当给定的所有列表里都没有元素可以弹出时,它会直接阻塞当前的连接

# 参数

  • key

键名

  • timeout

最大阻塞时间,单位为秒。如果超时时间设置为 0,则表示无限期阻塞

# 示例

> DEL list1 list2
(integer) 0
> RPUSH list1 a b c
(integer) 3
> BRPOP list1 list2 0
1) "list1"
2) "c"

# BRPOPLPUSH

# 语法

BRPOPLPUSH source destination timeout

# 描述

当源列表里有元素时,它的行为和 RPOPLPUSH 完全一样;如果在 MULTI/EXEC 事务块或 Lua 脚本里使用,行为也完全相同

# 参数

  • destination

目标列表的键

  • timeout

最大阻塞时间,单位为秒。如果超时时间设置为 0,则表示无限期阻塞

  • source

来源列表的关键字


# LINDEX

# 语法

LINDEX key index

# 描述

返回存储在指定键(key)的列表中,位于指定索引(index)位置的元素。索引是从 0 开始计算的,所以 0 代表第一个元素,1 代表第二个元素,依此类推。也可以使用负数索引来指定从列表尾部开始计算的元素

# 参数

  • key

键名

  • index

要返回的元素的从零开始的索引。负数索引从尾部开始计算

# 示例

> LPUSH mylist "World"
(integer) 1
> LPUSH mylist "Hello"
(integer) 2
> LINDEX mylist 0
"Hello"
> LINDEX mylist -1
"World"
> LINDEX mylist 3
(nil)

# LINSERT

# 语法

LINSERT key <BEFORE | AFTER> pivot element

# 描述

在键所对应的列表中,于参考值的前面或后面插入一个元素

# 参数

  • BEFORE | AFTER

决定将元素插入到基准值的前面还是后面

  • pivot

要相对于哪个现有元素进行插入

  • element

待插入的值

  • key

键名

# 示例

> RPUSH mylist "Hello"
(integer) 1
> RPUSH mylist "World"
(integer) 2
> LINSERT mylist BEFORE "World" "There"
(integer) 3
> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

# LLEN

# 语法

LLEN key

# 描述

返回存储在指定键(key)处的列表长度。如果该键不存在,则将其视为空列表并返回 0。如果该键存储的值不是列表类型,则会返回一个错误

# 参数

  • key

键名

# 示例

> LPUSH mylist "World"
(integer) 1
> LPUSH mylist "Hello"
(integer) 2
> LLEN mylist
(integer) 2

> LPUSH mylist "World"
(integer) 1
> LPUSH mylist "Hello"
(integer) 2
> LLEN mylist
(integer) 2

# LMOVE

# 语法

LMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT>

# 描述

以原子方式从 source 列表的头部或尾部弹出并移除第一个/最后一个元素,然后将其推入 destination 列表的头部或尾部参数决定

# 参数

  • source

来源列表的关键字

  • LEFT | RIGHT

从源列表的哪一端弹出元素:LEFT(头部)或 RIGHT(尾部)

# 示例

> RPUSH mylist "one"
(integer) 1
> RPUSH mylist "two"
(integer) 2
> RPUSH mylist "three"
(integer) 3
> LMOVE mylist myotherlist RIGHT LEFT
"three"
> LMOVE mylist myotherlist LEFT RIGHT
"one"
> LRANGE mylist 0 -1
1) "two"

# LMPOP

# 语法

LMPOP numkeys key [key ...] <LEFT | RIGHT> [COUNT count]

# 描述

系统会根据传入的参数,从第一个非空列表的左侧或右侧弹出元素。返回的元素数量受限于非空列表的长度与 count 参数两者中的较小值

# 参数

  • key

键名

  • numkey

后面跟随的键的数量

  • LEFT | RIGHT

从源列表的哪一端弹出元素:LEFT(头部)或 RIGHT(尾部)

  • COUNT

要弹出的元素数量。默认值为 1

# 示例

> LMPOP 2 non1 non2 LEFT COUNT 10
(nil)
> LPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
> LMPOP 1 mylist LEFT
1) "mylist"
2) 1) "five"
> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
> LMPOP 1 mylist RIGHT COUNT 10
1) "mylist"
2) 1) "one"
   2) "two"
   3) "three"
   4) "four"
> LPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
> LPUSH mylist2 "a" "b" "c" "d" "e"
(integer) 5
> LMPOP 2 mylist mylist2 right count 3
1) "mylist"
2) 1) "one"
   2) "two"
   3) "three"
> LRANGE mylist 0 -1
1) "five"
2) "four"
> LMPOP 2 mylist mylist2 right count 5
1) "mylist"
2) 1) "four"
   2) "five"
> LMPOP 2 mylist mylist2 right count 10
1) "mylist2"
2) 1) "a"
   2) "b"
   3) "c"
   4) "d"
   5) "e"
> EXISTS mylist mylist2
(integer) 0

# LPOP

# 语法

LPOP key [count]

# 描述

移除并返回指定 key 中存储的列表的第一个(或前几个)元素

# 参数

  • COUNT

要弹出的元素数量。默认值为 1

  • key

键名

# 示例

> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
> LPOP mylist
"one"
> LPOP mylist 2
1) "two"
2) "three"
> LRANGE mylist 0 -1
1) "four"
2) "five"

> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
> LPOP mylist
"one"
> LPOP mylist 2
1) "two"
2) "three"
> LRANGE mylist 0 -1
1) "four"
2) "five"

# LPOS

# 语法

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

# 描述

该命令会返回 Redis 列表中匹配元素的索引。在默认情况下(即不提供任何选项时),它会从列表的头部向尾部进行扫描,寻找第一个匹配的元素。如果找到了该元素,则返回其索引(即在列表中从 0 开始计算的位置);如果未找到匹配项,则返回 nil

# 参数

  • key

键名

  • RANK

要返回的第几个匹配项:1 表示从列表头部算起的第一个匹配项,-1 表示从列表尾部算起的第一个匹配项

  • COUNT num-matches

要返回的匹配项数量。如果设置为 0,则返回所有匹配项

  • index

要返回的元素的从零开始的索引。负数索引从尾部开始计算

  • MAXLEN len

最多比较 len 个元素。如果设置为 0(默认值),则会扫描整个列表

# 示例

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

> LPOS mylist c RANK -1
7

> LPOS mylist c COUNT 2
[2,6]

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

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


# LPUSH

# 语法

LPUSH key element [element ...]

# 描述

将指定的所有值插入到 key 对应列表的头部。如果 key 不存在,则在执行插入操作前,会先创建一个空列表。如果 key 对应的值不是列表类型,则会返回错误

# 参数

  • key

键名

  • element

待插入的值

# 示例

> LPUSH mylist "world"
(integer) 1
> LPUSH mylist "hello"
(integer) 2
> LRANGE mylist 0 -1
1) "hello"
2) "world"

> LPUSH mylist "world"
(integer) 1
> LPUSH mylist "hello"
(integer) 2
> LRANGE mylist 0 -1
1) "hello"
2) "world"

# LPUSHX

# 语法

LPUSHX key element [element ...]

# 描述

仅当 key 已经存在且存储的是列表时,才将指定的值插入到该列表的头部。与 LPUSH 命令相反,如果 key 尚不存在,则不执行任何操作

# 参数

  • key

键名

  • element

待插入的值

# 示例

> LPUSH mylist "World"
(integer) 1
> LPUSHX mylist "Hello"
(integer) 2
> LPUSHX myotherlist "Hello"
(integer) 0
> LRANGE mylist 0 -1
1) "Hello"
2) "World"
> LRANGE myotherlist 0 -1
(empty array)

# LRANGE

# 语法

LRANGE key start stop

# 描述

返回存储在 key 中的列表的指定元素。偏移量 start 和 stop 是基于 0 的索引,其中 0 表示列表的第一个元素,1 表示下一个元素,依此类推

# 参数

  • key

键名

  • start

基于 0 的起始索引。负数索引表示从列表尾部开始倒数计算

  • stop

基于 0 的起始索引(边界值)。负数索引表示从列表尾部开始倒数计算

# 示例

> RPUSH mylist "one"
(integer) 1
> RPUSH mylist "two"
(integer) 2
> RPUSH mylist "three"
(integer) 3
> LRANGE mylist 0 0
1) "one"
> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
> LRANGE mylist 5 10
(empty array)

> RPUSH mylist "one"
(integer) 1
> RPUSH mylist "two"
(integer) 2
> RPUSH mylist "three"
(integer) 3
> LRANGE mylist 0 0
1) "one"
> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
 LRANGE mylist 5 10
(empty array)

# LREM

# 语法

LREM key count element

# 描述

  • 从 key 对应的列表中,移除前 count 个与 element 相等的元素。count 参数的具体作用如下:
    • count > 0:从表头向表尾搜索,移除与 element 相等的元素;
    • count < 0:从表尾向表头搜索,移除与 element 相等的元素;
    • count = 0:移除列表中所有与 element 相等的元素

# 参数

  • key

键名

  • COUNT

要弹出的元素数量。默认值为 1

  • element

待插入的值

# 示例

> RPUSH mylist "hello"
(integer) 1
> RPUSH mylist "hello"
(integer) 2
> RPUSH mylist "foo"
(integer) 3
> RPUSH mylist "hello"
(integer) 4
> LREM mylist -2 "hello"
(integer) 2
> LRANGE mylist 0 -1
1) "hello"
2) "foo"

# LSET

# 语法

LSET key index element

# 描述

将列表中指定索引(index)位置的元素替换为 element

# 参数

  • key

键名

  • index

要返回的元素的从零开始的索引。负数索引从尾部开始计算

  • element

待插入的值

# 示例

> RPUSH mylist "one"
(integer) 1
> RPUSH mylist "two"
(integer) 2
> RPUSH mylist "three"
(integer) 3
> LSET mylist 0 "four"
OK
> LSET mylist -2 "five"
OK
> LRANGE mylist 0 -1
1) "four"
2) "five"
3) "three"

# LTRIM

# 语法

LTRIM key start stop

# 描述

对现有的列表进行修剪,使其仅保留指定范围内的元素。start 和 stop 都是从 0 开始计算的索引,其中 0 代表列表的第一个元素,1 代表下一个元素,依此类推

# 参数

  • key

键名

  • start

基于 0 的起始索引。负数索引表示从列表尾部开始倒数计算

  • stop

基于 0 的起始索引(边界值)。负数索引表示从列表尾部开始倒数计算

# 示例

LPUSH mylist someelement
LTRIM mylist 0 99

> RPUSH mylist "one"
(integer) 1
> RPUSH mylist "two"
(integer) 2
> RPUSH mylist "three"
(integer) 3
> LTRIM mylist 1 -1
OK
> LRANGE mylist 0 -1
1) "two"
2) "three"

# RPOP

# 语法

RPOP key [count]

# 描述

移除并返回存储在指定键中的列表的最后一个元素

# 参数

  • key

键名

  • COUNT

要弹出的元素数量。默认值为 1

# 示例

> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
> RPOP mylist
"five"
> RPOP mylist 2
1) "four"
2) "three"
> LRANGE mylist 0 -1
1) "one"
2) "two"

> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
> RPOP mylist
"five"
> RPOP mylist 2
1) "four"
2) "three"
> LRANGE mylist 0 -1
1) "one"
2) "two

# RPOPLPUSH

# 语法

RPOPLPUSH source destination

# 描述

原子性地弹出源列表的最后一个元素,并将其推入目标列表的第一个位置

# 参数

  • destination

目标列表的键

  • source

来源列表的关键字

# 示例

> RPUSH mylist "one"
(integer) 1
> RPUSH mylist "two"
(integer) 2
> RPUSH mylist "three"
(integer) 3
> RPOPLPUSH mylist myotherlist
"three"
> LRANGE mylist 0 -1
1) "one"
2) "two"
> LRANGE myotherlist 0 -1
1) "three"

# RPUSH

# 语法

RPUSH key element [element ...]

# 描述

将指定的所有值依次插入到 key 对应列表的尾部。如果 key 还不存在,系统会先创建一个空列表,然后再执行插入操作。但如果 key 当前对应的值不是列表类型,就会直接报错

# 参数

  • key

键名

  • element

待插入的值

# 示例

> RPUSH mylist "hello"
(integer) 1
> RPUSH mylist "world"
(integer) 2
> LRANGE mylist 0 -1
1) "hello"
2) "world"

> RPUSH mylist "hello"
(integer) 1
> RPUSH mylist "world"
(integer) 2
> LRANGE mylist 0 -1
1) "hello"
2) "world"

# RPUSHX

# 语法

RPUSHX key element [element ...]

# 描述

只有当 key 已经存在并且确实是一个列表时,才会将指定的值插入到该列表的尾部。与 RPUSH 不同的是,如果 key 还不存在,这个命令不会做任何操作

# 参数

  • key

键名

  • element

待插入的值

# 示例

> RPUSH mylist "Hello"
(integer) 1
> RPUSHX mylist "World"
(integer) 2
> RPUSHX myotherlist "World"
(integer) 0
> LRANGE mylist 0 -1
1) "Hello"
2) "World"
> LRANGE myotherlist 0 -1
(empty array)