list列表类型是用来存储多个有序的字符串。列表中的每个字符串称为元素,一个列表最多可以存储( 2 32 2^{32} 232-1)个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定下标的元素等等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。
列表两端插入和弹出操作:

列表的获取、删除等操作:

命令
LPUSH
语法:
shell
LPUSH key element [element ...]
功能:将一个或者多个元素头插到list中。
命令有效版本:1.0.0以后
时间复杂度:O(K),K为单次插入的元素个数
返回值:插入后list的长度。
演示:
shell
127.0.0.1:6379> lpush key element
(integer) 1
127.0.0.1:6379> lpush key element2 element3 element4
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "element4"
2) "element3"
3) "element2"
4) "element"
127.0.0.1:6379>
LPUSHX
语法:
shell
LPUSH key element [element ...]
功能:当key存在时,将一个或者多个元素头插到list中。不存在,直接返回。
命令有效版本:2.0.0以后
时间复杂度:O(K),K为单次插入的元素个数
返回值:插入后list的长度。
演示:
shell
127.0.0.1:6379> lpush key element
(integer) 1
127.0.0.1:6379> lpushx key element1 element2
(integer) 3
127.0.0.1:6379> del key
(integer) 1
127.0.0.1:6379> lpushx key element3
(integer) 0
127.0.0.1:6379>
RPUSH
语法:
shell
RPUSH key element [element ...]
功能:将一个或者多个元素尾插到list中
命令有效版本:1.0.0以后
时间复杂度:O(K),K为单次插入的元素个数
返回值:插入后list的长度。
演示:
shell
127.0.0.1:6379> rpush key element1 element2 element3
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "element1"
2) "element2"
3) "element3"
127.0.0.1:6379>
RPUSHX
语法:当key存在时,将一个或者多个元素尾插到list中。不存在,直接返回。
shell
RPUSHX key element [element ...]
功能:
命令有效版本:2.0.0以后
时间复杂度:O(K),K为单次插入的元素个数
返回值:插入后list的长度。
演示:
shell
127.0.0.1:6379> rpushx key 1 2 3
(integer) 0
127.0.0.1:6379> rpush key 1 2 3
(integer) 3
127.0.0.1:6379> rpushx key 4 5 6
(integer) 6
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379>
LRANGE
语法:
shell
LRANGE key start stop
功能:获取从start到end区间的所有元素,左闭右闭。
命令有效版本:1.0.0以后
时间复杂度:O(N)
返回值:指定区间的元素
演示:
shell
127.0.0.1:6379> lpush key element2 element3 element4
(integer) 3
127.0.0.1:6379> lpush key element5 element6 element7
(integer) 6
127.0.0.1:6379> lrange key 0 -1
1) "element7"
2) "element6"
3) "element5"
4) "element4"
5) "element3"
6) "element2"
127.0.0.1:6379> lrange key 1 2
7) "element6"
8) "element5"
127.0.0.1:6379> lrange key 0 100
9) "element7"
10) "element6"
11) "element5"
12) "element4"
13) "element3"
14) "element2"
127.0.0.1:6379>
注意:如果指定区间超过了合法区域,lrange仍然会返回指定区间内合法的区域。
LPOP
语法:
shell
LPOP key
功能:从list左侧取出元素,头删。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:取出的元素或是nil
演示:
shell
127.0.0.1:6379> lpush key 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange key 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lpop key
"6"
127.0.0.1:6379> lpop key
"5"
127.0.0.1:6379> lrange key 0 -1
7) "4"
8) "3"
9) "2"
10) "1"
127.0.0.1:6379>
RPOP
语法:
shell
RPOP key
功能:从list右侧取出元素,尾删。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:取出的元素或是nil
演示:
shell
127.0.0.1:6379> lpush key 1 2 3
(integer) 3
127.0.0.1:6379> rpop key
"1"
127.0.0.1:6379> rpop key
"2"
127.0.0.1:6379> rpop key
"3"
127.0.0.1:6379> rpop key
(nil)
127.0.0.1:6379>
LINDEX
语法:
shell
LINDEX key index
功能:获取从左数第index位置的元素
命令有效版本:1.0.0以后
时间复杂度:O(N)
返回值:取出的元素或者nil
演示:
shell
127.0.0.1:6379> lpush key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lindex key 0
"5"
127.0.0.1:6379> lrange key 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lindex key -1
"1"
127.0.0.1:6379> lindex key 100
(nil)
127.0.0.1:6379>
LINSERT
语法:
shell
LINSERT key <BEFORE | AFTER> pivot element
功能:在特定位置插入元素。
命令有效版本:1.0.0以后
时间复杂度:O(N)
返回值:插入后的list元素
演示:
shell
127.0.0.1:6379> lpush key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange key 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> linsert key before 5 100
(integer) 6
127.0.0.1:6379> lrange key 0 -1
6) "100"
7) "5"
8) "4"
9) "3"
10) "2"
11) "1"
127.0.0.1:6379> linsert key after 1 999
(integer) 7
127.0.0.1:6379> lrange key 0 -1
12) "100"
13) "5"
14) "4"
15) "3"
16) "2"
17) "1"
18) "999"
127.0.0.1:6379>
LLEN
语法:
shell
LLEN key
功能:获取list长度
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:list的长度
演示:
shell
127.0.0.1:6379> lpush key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> llen key
(integer) 5
127.0.0.1:6379> llen key2
(integer) 0
127.0.0.1:6379>
阻塞版本的命令
blpop和brpop是lpop和rpop的阻塞版本,和对应非阻塞版本的作用基本一致,除了:
-
在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但是如果列表中没有元素,非阻塞版本会立即返回nil。但是阻塞版本会根据timeout,阻塞一段时间,期间Redis可以执行其他命令,但是要求执行该命令的客户端会表现为阻塞状态。
-
命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回。
-
如果多个客户端同时对一个键执行阻塞pop,则最先执行命令的客户端会得到弹出的元素。
BLPOP
语法:
shell
BLPOP key [key ...] timeout
功能:LPOP的阻塞版本。
命令有效版本:1.0.0以后。
时间复杂度:O(1)
返回的值:取出的元素或者nil
演示:

启动两个客户端

语法:
shell
RLPOP key [key ...] timeout
功能:RPOP的阻塞版本。
命令有效版本:1.0.0以后。
时间复杂度:O(1)
返回的值:取出的元素或者nil
演示:
基本等同于BLPOP
内部编码
-
ziplist(压缩列表)
- 当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中的每个元素的长度都小于list-max-ziplist-value配置(默认64个)时,Redis会选用ziplis来作为列表的内部实现来减少内存消耗。
-
linklist(链表)
- 当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。
注意:在5.0版本以及列表的内部编码统一为了quicklist。
quicklist结合了两者的优点,使用链表但是链表的节点是压缩列表。