列表类型简介
列表(list)用于存储多个有序的字符串。列表是一种比较灵活的数据结构,可以充当栈和队列的角色,在实际开发上有很多应用场景
列表的特点:
列表中的元素是有序的,可以通过索引下标来获取某个元素或者某个范围内的元素列表
列表中的元素是可以重复的
操作命令
1、LPUSH key value [value …] : 先进后出,在列表头部插入元素
127.0.0.1:6379> LPUSH k1 1 2 3 4 5
(integer) 5
2、LRANGE key start stop : 出栈,根据索引,获取列表元素
127.0.0.1:6379> LRANGE k1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
3、RPUSH key value [value …] :先进先出,在列表的尾部插入元素
127.0.0.1:6379> RPUSH k1 0 -1 -2
(integer) 9
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "0"
8) "-1"
9) "-2"
4、LPUSHX key value:将一个值插入到已存在的列表头部
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "0"
8) "-1"
9) "-2"
127.0.0.1:6379> LPUSHX k1 xxx
(integer) 14
127.0.0.1:6379> LRANGE k1 0 -1
1) "xxx"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
8) "0"
9) "3"
10) "2"
11) "1"
12) "0"
13) "-1"
14) "-2"
5、LPOP key : 左边出栈,获取列表的第一个元素 (会删除元素)
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "0"
8) "-1"
9) "-2"
127.0.0.1:6379> LPOP k1
"6"
127.0.0.1:6379> LRANGE k1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
6) "0"
7) "-1"
8) "-2"
6、RPOP key: 右边出栈,获取列表的最后一个元素 (会删除元素)
127.0.0.1:6379> LRANGE k1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
6) "0"
7) "-1"
8) "-2"
127.0.0.1:6379> RPOP k1
"-2"
127.0.0.1:6379> LRANGE k1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
6) "0"
7) "-1"
7、lrem key count value (count数量) : 根据key,删除n个value
127.0.0.1:6379> LPUSH k1 1 2 3 4 5 2 7 2 8
(integer) 9
127.0.0.1:6379> LREM k1 2 2
(integer) 2
127.0.0.1:6379> LRANGE k1 0 -1
1) "8"
2) "7"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
8、lindex key index :根据索引,取出元素
127.0.0.1:6379> LRANGE k1 0 -1
1) "8"
2) "7"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
127.0.0.1:6379> LINDEX k1 2
"5"
9、llen key : 链表长度,元素个数
127.0.0.1:6379> LRANGE k1 0 -1
1) "8"
2) "7"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
127.0.0.1:6379> LLEN k1
(integer) 7
10、ltrim key start stop :保留指定索引区间的元素 (start起始索引 stop结束索引)
127.0.0.1:6379> LPUSH k1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> LTRIM k1 0 4
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
11、lset key index value:通过索引设置列表元素的值
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
127.0.0.1:6379> lset k1 1 2
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "2"
12、linsert key before|after pivot value:在列表的元素前或者后插入元素 (pivot定位查找的值,注意不是下标, value 添加的值)
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> LINSERT k1 before 2 A
(integer) 7
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "A"
6) "2"
7) "1"
127.0.0.1:6379> LINSERT k1 after 6 B
(integer) 8
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "B"
3) "5"
4) "4"
5) "3"
6) "A"
7) "2"
8) "1"
13、阻塞单播队列 FIFO
BLPOP key [key…] timeout:左边弹出值,(key可以是多个,如果没有值,会一直等到有值,直到过期)
BRPOP key [key…] timeout:右边弹出值
127.0.0.1:6379> BLPOP k1 0 开启阻塞
打开另一个窗口进行添加元素
127.0.0.1:6379> LPUSH k1 A
(integer) 1
回到原窗口
127.0.0.1:6379> BLPOP k1 0
1) "k1"
2) "A"
(4.43s)
BRPOP 同理
14、BRPOPLPUSH source destination:移除列表的最后一个元素,并将该元素添加到另一个列表并返回 (源list的key值 目的list的key值)
127.0.0.1:6379> LPUSH k1 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379> LRANGE k1 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"
127.0.0.1:6379> RPOPLPUSH k1 k2
"1"
127.0.0.1:6379> LRANGE k2 0 -1
1) "1"
127.0.0.1:6379> LRANGE k1 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
15、BRPOPLPUSH source destination timeout:从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
127.0.0.1:6379> LPUSH k1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> BRPOPLPUSH k1 k2 2
"1"
127.0.0.1:6379> BRPOPLPUSH k1 k2 2
"2"
127.0.0.1:6379> BRPOPLPUSH k1 k2 2
"3"
127.0.0.1:6379> BRPOPLPUSH k1 k2 2
"4"
127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
127.0.0.1:6379> LRANGE k2 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
使用场景
列表类型可以用于比如:
消息队列,Redis 的 lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
文章列表
每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。
实现其他数据结构
lpush+lpop =Stack(栈)
lpush +rpop =Queue(队列)
lpsh+ ltrim =Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)