Skip to content

List类型相关命令

List是Redis中最常用数据类型,特点是单key多value。

1. List类型概述

底层实际是一个双向链表结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。left、right都可以插入添加:
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。 Alt text

2. LPUSH命令

语法: LPUSH key element [element ...]
用于将一个或多个值批量插入到列表key 的头部。如果key不存在,那么在进行 push 操作前会创建一个空列表。如果key对应的值不是 list 类型,那么会返回一个错误。

sh
127.0.0.1:6379> lpush mylist 1 2 3 4 5
(integer) 5
127.0.0.1:6379> type mylist
list

3. RPUSH命令

语法: RPUSH key element [element ...]
向存储在key中的列表的尾部插入所有指定的值。如果key不存在,那么会创建一个空的列表然后再进行push操作。当key保存的不是列表,那么会返回一个错误。

sh
127.0.0.1:6379> rpush mylist2 11 22 33 44 55
(integer) 5
127.0.0.1:6379> type mylist2
list

4. LRANGE命令

语法: LRANGE key start stop
用于返回列表中指定区间内的元素,区间以偏移量startstop指定。其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推。也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。

sh
127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrange mylist -1 0
(empty array)
127.0.0.1:6379> lrange mylist2 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"

应用场景: 微信公众号文章分页获取前10条

5. LPUSHX命令

语法: LPUSHX key element [element ...]
在当key存在并且存储着一个list类型值的时候,向list的头部插入element。与LPUSH的区别是,当key不存在的时候不会进行任何操作。

sh
## 不会自动创建list,也不添加元素
127.0.0.1:6379> lpushx list1 "test" "here"
(integer) 0
127.0.0.1:6379> lrange list1 0 -1
(empty array)
127.0.0.1:6379> lpush list1 "china"
(integer) 1
## 往现成的list1中添加元素
127.0.0.1:6379> lpushx list1 "learn"
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "learn"
2) "china"

6. RPUSHX命令

语法: RPUSHX key element [element ...]
将值value插入到列表key的表尾, 当且仅当key存在并且是一个列表。返回命令执行之后列表的长度。和RPUSH命令的区别是, 当key不存在时,RPUSHX命令什么也不做。

sh
127.0.0.1:6379> rpushx list2 jack learn
(integer) 0
127.0.0.1:6379> rpush list2 jack
(integer) 1
127.0.0.1:6379> rpushx list2 learn
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "jack"
2) "learn"

7. LPOP命令

语法: LPOP key [count]
用于删除并返回存储在key中的列表的第一个元素。如果带有count参数,表示移除列表开头开始一共count个元素。

sh
127.0.0.1:6379> lpop list1 
"learn"
127.0.0.1:6379> lrange list1 0 -1
1) "china"
127.0.0.1:6379> lpop mylist 2
1) "5"
2) "4"
127.0.0.1:6379> lrange mylist 0 -1
1) "3"
2) "2"
3) "1"

8. RPOP命令

语法: RPOP key [count]
用于移除并返回列表key的最后一个元素。如果带有count参数,表示移除列表末尾开始一共count个元素。

sh
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> rpop mylist 2
1) "1"
2) "2"
127.0.0.1:6379> rpop mylist
"3"
127.0.0.1:6379> lrange mylist 0 -1
(empty array)

9. LINDEX命令

语法: LINDEX key index
返回列表key里索引index位置存储的元素。index下标是从0开始索引的,所以0是表示第一个元素,1表示第二个元素,并以此类推。负数索引用于指定从列表尾部开始索引的元素,在这种方法下,-1表示最后一个元素,-2表示倒数第二个元素,并以此往前推。当key值不是列表的时候,会返回错误。

sh
127.0.0.1:6379> lindex mylist2 0
"11"
127.0.0.1:6379> lindex mylist2 1
"22"
127.0.0.1:6379> lindex mylist2 -1
"55"

10. LLEN命令

语法: LLEN key
用于返回存储在key中的列表长度。如果key不存在,则key被解释为一个空列表,返回0。如果key不是列表类型,返回一个错误。

sh
127.0.0.1:6379> llen mylist2
(integer) 5
127.0.0.1:6379> llen mylist
(integer) 0

11. LREM命令

语法: LREM key count element
用于从列表key中删除前count个值等于element的元素。这个count参数通过下面几种方式影响这个操作:

  • count > 0: 从头到尾删除值为 value 的元素。
  • count < 0: 从尾到头删除值为 value 的元素。
  • count = 0: 移除所有值为 value 的元素。
sh
127.0.0.1:6379> lpush list6 1 1 1 2 2 3 3 4
(integer) 8
127.0.0.1:6379> lrem list6 2 3
(integer) 2
127.0.0.1:6379> lrange list6 0 -1
1) "4"
2) "2"
3) "2"
4) "1"
5) "1"
6) "1"
127.0.0.1:6379> lrem list6 4 4
(integer) 1
127.0.0.1:6379> lrange list6 0 -1
1) "2"
2) "2"
3) "1"
4) "1"
5) "1"

12. LTRIM命令

语法: LTRIM key start stop
用于截取指定索引区间的元素覆盖旧列表,startstop都是由0开始计数的,startend也可以用负数来表示与表尾的偏移量,比如 -1 表示列表里的最后一个元素, -2 表示倒数第二个,等等。超过范围的下标并不会产生错误;如果start超过列表尾部,或者start>end,结果会是新列表变成空表(即该key会被移除)。如果end超过列表尾部,Redis会将列表尾部元素当作新列表的最后一个元素。

sh
127.0.0.1:6379> lrange list6 0 -1
1) "2"
2) "2"
3) "1"
4) "1"
5) "1"
127.0.0.1:6379> LTRIM list6 0 99
OK
127.0.0.1:6379> lrange list6 0 -1
1) "2"
2) "2"
3) "1"
4) "1"
5) "1"
127.0.0.1:6379> llen list6
(integer) 5
127.0.0.1:6379> ltrim list6 0 4
OK
127.0.0.1:6379> llen list6
(integer) 5
127.0.0.1:6379> ltrim list6 0 3
OK
127.0.0.1:6379> llen list6
(integer) 4
127.0.0.1:6379> lrange list6 0 -1
1) "2"
2) "2"
3) "1"
4) "1"

13. RPOPLPUSH命令(已过时)

语法: RPOPLPUSH source destination
用于原子地从列表source中移除并返回最后一个元素,然后把这个元素插入为列表destination的第一个位置。自Redis6.2.0之后被置为过时,用LMOVE命令配合RIGHTLEFT参数使用作用等效。
如果列表source不存在,返回nil ,什么也不执行。
如果列表sourcedestination相同,相当于从列表的一端删除元素,在放入列表的另一端,所以可以当做一个列表循环命令。

sh
127.0.0.1:6379> lpush mylist "one" "two"
(integer) 2
127.0.0.1:6379> lpush mylist2 "three" "four"
(integer) 2
127.0.0.1:6379> rpoplpush mylist mylist2
"one"
127.0.0.1:6379> lrange mylist 0 -1
1) "two"
127.0.0.1:6379> lrange mylist2 0 -1
1) "one"
2) "four"
3) "three"

14. LSET命令

语法: LSET key index element
用于设置列表key中index位置的元素值为element, 当index超出列表索引范围时会返回错误ERR index out of range

sh
127.0.0.1:6379> llen mylist
(integer) 1
127.0.0.1:6379> lset mylist 0 "one"
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "one"
127.0.0.1:6379> lset mylist 1 "two"
(error) ERR index out of range

14. LINSERT命令

语法: LINSERT key <BEFORE | AFTER> pivot element
用于把element插入到列表key中参考值pivot的前面或后面。返回值为执行操作后的列表长度,若列表中pivot参考值不存在的时候返回-1,当key不存在时,这个list会被看作是空list,什么都不执行。当key存在,值不是列表类型时,返回错误。

sh
127.0.0.1:6379> linsert mylist after "one" "two"
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "one"
2) "two"
127.0.0.1:6379> linsert mylist before "one" "jack:"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "jack:"
2) "one"
3) "two"

15. LMOVE命令

语法: LMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT>
原子性操作source列表删除第一个或者最后一个元素并将该元素放到destination列表的头或者尾部,获取位置和放置位置取决于LEFTRIGHT参数。如果source列表不存在,命令执行什么也不操作直接返回nil, 如果列表sourcedestination相同,相当于从列表的一端删除元素,在放入列表的另一端,所以可以当做一个列表循环命令。
应用场景: 用作消息队列

sh
127.0.0.1:6379> lpush mylist one two three
(integer) 3
127.0.0.1:6379> lmove mylist myotherlist right left
"one"
127.0.0.1:6379> lmove mylist myotherlist right left
"two"
127.0.0.1:6379> lmove mylist myotherlist right left
"three"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "three"
2) "two"
3) "one"

15. LPOS命令

语法: LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
按照元素查找获取列表中位置,如果命令没有可选参数,默认是扫描列表从头到尾查找元素,查找第一个与匹配element返回从0开始的位置,若没有找到,将返回nil。

  • RANK: 表示返回第几个匹配的元素
  • COUNT: 表示返回要匹配的总数量,默认返回一个
  • MAXLEN: 表示只查找最多len个列表元素,在大列表中查询可以提高查询效率
  • RANKCOUNT组合使用: COUNT表示返回要匹配的总数,RANK表示从第几个匹配开始计算。
sh
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> llen mylist
(integer) 11
127.0.0.1:6379> lrange mylist 0 -1
 1) "a"
 2) "b"
 3) "c"
 4) "d"
 5) "1"
 6) "2"
 7) "3"
 8) "4"
 9) "3"
10) "3"
11) "3"
127.0.0.1:6379> lpos mylist 3 
(integer) 6
127.0.0.1:6379> lpos mylist 3 2
(error) ERR syntax error
127.0.0.1:6379> lpos mylist 3 rank 2
(integer) 8
127.0.0.1:6379> lpos mylist 3 rank 2 count 2
1) (integer) 8
2) (integer) 9
127.0.0.1:6379> lpos mylist 3 rank 2 count 2 maxlen 9999
1) (integer) 8
2) (integer) 9