列表(List)数据类型

xiaohai 2021-05-05 21:59:28 1883人围观 标签: Redis 
简介 列表是常用的一种数据类型。类别能存储一组对象,因此可以被用作栈或者队列。在Redis中,与键相关联的值可以是字符串组成的列表。Redis中的列表更像是双向链表。

  列表是常用的一种数据类型。类别能存储一组对象,因此可以被用作栈或者队列。在Redis中,与键相关联的值可以是字符串组成的列表。Redis中的列表更像是双向链表。

相关命令

LPUSH、RPUSH、LRANGE、LINSERT、LINDEX、LPOP、RPOP、LPUSHX、RPUSHX、LTRIM、LLEN、BLPOP、BRPOP

操作

1、使用LPUSH向列表左端插入两个值

127.0.0.1:6379> LPUSH list_1 "value 1" "value 2"
(integer) 2

2、使用LRANGE获取列表中的所有值
Redis中索引的定义,如果该列表有n个元素,那么从从左到右为:0~n-1,如果从右到左为:-1~-n。所以0~-1则为整个列表。

127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 2"
2) "value 1"

3、使用RPUSH向列表右端插入两个值

127.0.0.1:6379> RPUSH list_1 "value 3" "value 4"
(integer) 4

127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 2"
2) "value 1"
3) "value 3"
4) "value 4"

4、使用LINSERT命令在某个值后面插入一个新的值

127.0.0.1:6379> LINSERT list_1 AFTER "value 1" "value 5"  #在value 1后面插入一个值,AFTER关键字
(integer) 5
127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 2"
2) "value 1"
3) "value 5"
4) "value 3"
5) "value 4"

127.0.0.1:6379> LINSERT list_1 BEFORE "value 1" "value 6"  #在value 1前面插入一个值,BEFORE关键字
(integer) 6
127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 2"
2) "value 6"
3) "value 1"
4) "value 5"
5) "value 3"
6) "value 4"

5、使用LINDEX获取对应索引位置的值,下标是从0开始

127.0.0.1:6379> LINDEX list_1 3
"value 5"
127.0.0.1:6379> LINDEX list_1 5
"value 4"

6、使用RPUSH、LPUSH、LINSERT命令后,返回列表的长度。向列表中插入值时,如果不存在会自动创建。如果我们只想当列表存在时才将值插入到列表中,就需要使用LPUSHX和RPUSHX命令。

127.0.0.1:6379> LPUSHX list_2 "value 11"
(integer) 0
127.0.0.1:6379> RPUSHX list_2 "value 11"
(integer) 0
127.0.0.1:6379> LPUSHX list_1 "value 11"
(integer) 7
127.0.0.1:6379> RPUSHX list_1 "value 12"
(integer) 8
127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 11"
2) "value 2"
3) "value 6"
4) "value 1"
5) "value 5"
6) "value 3"
7) "value 4"
8) "value 12"

7、使用LPOP命令从列表的最左端删除一个元素,返回值为元素值

127.0.0.1:6379> LPOP list_1
"value 11"

8、使用RPOP命令从列表的最右端删除一个元素,返回值为元素值

127.0.0.1:6379> RPOP list_1
"value 12"

9、LTRIM命令用于删除列表中多个元素的同时,只保留从start和end索引所指定范围内的元素

127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 2"
2) "value 6"
3) "value 1"
4) "value 5"
5) "value 3"
6) "value 4"
127.0.0.1:6379> LTRIM list_1 1 -1 #只删除了下标为0的元素的值
OK
127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 6"
2) "value 1"
3) "value 5"
4) "value 3"
5) "value 4"

10、LSET命令设置列表中指定索引的元素值

127.0.0.1:6379> LSET list_1 1 "value 10"
OK
127.0.0.1:6379> LRANGE list_1 0 -1
1) "value 6"
2) "value 10"
3) "value 5"
4) "value 3"
5) "value 4"

11、使用LLEN命令来获取列表中的元素的个数

127.0.0.1:6379> LLEN list_1
(integer) 5

12、LPOP和RPOP命令对应的有阻塞版本:BLPOP和BRPOP命令。当列表的为空时,客户端会阻塞,也就是等待有元素写入。可以设置一个超时时间,如果设置为0表示永久等待。

#打开第一个终端,进入redis客户端,输入下面命令
127.0.0.1:6379> BRPOP worker-1 0 

#打开第二个终端,进入redis客户端,输入下面命令
127.0.0.1:6379> BRPOP worker-1 0

#以上都处于等待状态

#打开第三个终端,进入redis客户端,输入下面命令
127.0.0.1:6379> LPUSH worker-1 "info 1"
(integer) 1

#第一个客户端会响应,但第二个客户端会继续阻塞并监听
```bash
127.0.0.1:6379> BRPOP worker-1 0
1) "worker-1"
2) "info 1"
(127.75s)

#响应完成后再进行监听
127.0.0.1:6379> BRPOP worker-1 0 

#在第三个客户端输入下面的命令
127.0.0.1:6379> LPUSH worker-1 "info 2"
(integer) 1

#第二个客户端会响应,但是第一个客户端会继续阻塞并监听
127.0.0.1:6379> BRPOP worker-1 0
1) "worker-1"
2) "info 2"
(121.53s)