本文最后更新于 319 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
Redis的列表(list)数据类型的应用场景
一.列表的增加指令
1.使用"LPUSH"指令往列表中插入数据,如果KEY不存在则创建KEY,若KEY已存在则继续在列表的最前面的元素中插入数据
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
(empty list or set)
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH devops ci cd python golang # 如果KEY不存在则创建KEY并插入数据,注意我插入的顺序
(integer) 4
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> KEYS *
1) "devops"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1 # 查看列表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。注意我查看的顺序和插入的顺序是相反的哟~
1) "golang"
2) "python"
3) "cd"
4) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH devops docker kubernetes # 如果KEY已经存在,则依旧会插入数据。
(integer) 6
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "kubernetes"
2) "docker"
3) "golang"
4) "python"
5) "cd"
6) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"LPUSHX"指令往已经存在的列表中首位插入一个元素,如果KEY不存在则此指令不生效且返回值为0。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "devops"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "kubernetes"
2) "docker"
3) "golang"
4) "python"
5) "cd"
6) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSHX devops java # LPUSHX指令只能一次往已经存在的KEY中插入一个元素,无法同时插入多个元素哟~
(integer) 7
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSHX devops vue
(integer) 8
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "vue"
2) "java"
3) "kubernetes"
4) "docker"
5) "golang"
6) "python"
7) "cd"
8) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSHX bigdata hadoop # 注意哈,bigdata这个KEY并不存在,因此本次无法插入数据!因此返回值为0。
(integer) 0
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> KEYS *
1) "devops"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
3.使用"LINSERT ... BEFORE/AFTER ..."在已经存在的KEY的前后插入新的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "devops"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "vue"
2) "java"
3) "kubernetes"
4) "docker"
5) "golang"
6) "python"
7) "cd"
8) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LINSERT devops BEFORE java ELK
(integer) 9
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "vue"
2) "ELK"
3) "java"
4) "kubernetes"
5) "docker"
6) "golang"
7) "python"
8) "cd"
9) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LINSERT devops AFTER java JavaScript
(integer) 10
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "vue"
2) "ELK"
3) "java"
4) "JavaScript"
5) "kubernetes"
6) "docker"
7) "golang"
8) "python"
9) "cd"
10) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
4.使用"RPUSH"指令在列表的尾部追加数据
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> LPUSH bigdata hadoop storm
(integer) 2
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPUSH bigdata spark flink clickhouse
(integer) 5
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
3) "spark"
4) "flink"
5) "clickhouse"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
5.使用"RPUSHX"指令往已经存在的列表中末尾插入一个元素,如果KEY不存在则此指令不生效且返回值为0。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "devops"
2) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
3) "spark"
4) "flink"
5) "clickhouse"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPUSHX bigdata impala # 注意哈,使用RPUSHX指令同时只能在末尾插入一个元素,插入成功后返回值为现有列表的长度。
(integer) 6
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPUSHX bigdata hive
(integer) 7
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
3) "spark"
4) "flink"
5) "clickhouse"
6) "impala"
7) "hive"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPUSHX mq kafka # 注意哈,名为mq的KEY并不存在,因此无法插入数据,返回值为0。
(integer) 0
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPUSHX mq redis
(integer) 0
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> KEYS *
1) "devops"
2) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
二.列表的查看指令
1.使用"LRANGE"指令查看列表中的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
(empty list or set)
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH devops ci cd python golang
(integer) 4
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> KEYS *
1) "devops"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 0 # 取第一个元素,其中0表示第一个元素。
1) "golang"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 2 # 取前3个元素,其中0表示第一个元素,2表示第三个元素。
1) "golang"
2) "python"
3) "cd"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1 # 查看列表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
1) "golang"
2) "python"
3) "cd"
4) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"LPOP"指令移除KEY首部的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "demo"
2) "devops"
3) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
3) "spark"
4) "flink"
5) "clickhouse"
6) "impala"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPOP bigdata # 将bigdata的KEY中首个元素取出,并在原KEY中移除该元素。
"storm"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPOP bigdata
"hadoop"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPOP bigdata
"spark"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "flink"
2) "clickhouse"
3) "impala"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
3.使用"RPOP"指令移除KEY尾部的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "demo"
2) "devops"
3) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "java"
5) "JavaScript"
6) "kubernetes"
7) "docker"
8) "golang"
9) "python"
10) "cd"
11) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPOP devops # 将devops的KEY中尾部元素取出,并在原KEY中移除该元素。
"ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPOP devops
"cd"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPOP devops
"python"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPOP devops
"golang"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPOP devops
"docker"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "java"
5) "JavaScript"
6) "kubernetes"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
4.使用"LINDEX"指令基于索引的方式查看KEY中的元素,若元素不存在则返回"nil"。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "demo"
2) "devops"
3) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "java"
5) "JavaScript"
6) "kubernetes"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LINDEX devops 2 # 查询索引下标为2的元素,注意哈,索引下标为2表示查询的第3个元素,因为列表的下标索引默认是从0开始的哟~
"ELK"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LINDEX devops 4
"JavaScript"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LINDEX devops 6 # 由于devops的KEY只有6个元素,因此其对应的索引为0-5,但我们查询下标为6的索引表示访问第七个元素,因此返回为nil。
(nil)
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LINDEX devops 7
(nil)
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "java"
5) "JavaScript"
6) "kubernetes"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
三.列表的修改指令
1.使用"LSET"指令将指定索引的元素替换为我们想要修改的数据,如果元素不存在则抛出异常。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "demo"
2) "devops"
3) "bigdata"
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "java"
5) "JavaScript"
6) "kubernetes"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LSET devops 3 Python # 我们将索引下标为3的元素(对应第四个元素,即"Java")替换为"Python"
OK
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "Python"
5) "JavaScript"
6) "kubernetes"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LSET devops 6 Golang # 由于我们只有6个元素,因此对应的索引下标为0-5,此处我对索引下标为6的元素进行修改会抛出索引越界异常哟~
(error) ERR index out of range
127.0.0.1:6379[11]>
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "Python"
5) "JavaScript"
6) "kubernetes"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"RPOPLPUSH source destination"指令将名为"source"的KEY的末尾元素删除并插入到名为"destination"的KEY的头部元素。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "devops"
2) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
3) "spark"
4) "flink"
5) "clickhouse"
6) "impala"
7) "hive"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "vue"
2) "ELK"
3) "java"
4) "JavaScript"
5) "kubernetes"
6) "docker"
7) "golang"
8) "python"
9) "cd"
10) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> RPOPLPUSH bigdata devops # 将名为"bigdata"的KEY的最后一个元素"hive"删除,并将删除的元素插入到名为"devops"的KEY的第一个元素中。
"hive"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE bigdata 0 -1
1) "storm"
2) "hadoop"
3) "spark"
4) "flink"
5) "clickhouse"
6) "impala"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE devops 0 -1
1) "hive"
2) "vue"
3) "ELK"
4) "java"
5) "JavaScript"
6) "kubernetes"
7) "docker"
8) "golang"
9) "python"
10) "cd"
11) "ci"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
四.列表的删除指令
1.使用"LTRIM"指令以索引的方式排除KEY中指定的元素,其它的元素全部删除
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "demo"
2) "devops"
3) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE demo 0 -1
1) "F"
2) "F"
3) "E"
4) "D"
5) "D"
6) "D"
7) "D"
8) "B"
9) "A"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LTRIM demo 0 2 # 以索引的方式排除KEY中指定的元素,其它的元素全部删除,其中0表示第一个元素,其中2表示列表中的第三个元素。
OK
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE demo 0 -1
1) "F"
2) "F"
3) "E"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"LREM"指令删除匹配的VALUE指定的次数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> DEL demo
(integer) 1
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH demo A B B B C D D D D E F F
(integer) 12
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE demo 0 -1
1) "F"
2) "F"
3) "E"
4) "D"
5) "D"
6) "D"
7) "D"
8) "C"
9) "B"
10) "B"
11) "B"
12) "A"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LREM demo 2 B # 删除名为demo的KEY的'B'元素,匹配次数为2次,若存在多个'B'元素,只会有限删除前2个匹配的元素哟~
(integer) 2
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE demo 0 -1
1) "F"
2) "F"
3) "E"
4) "D"
5) "D"
6) "D"
7) "D"
8) "C"
9) "B"
10) "A"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LREM demo 3 C # 删除名为demo的KEY的'C'元素,匹配次数为3次,如果不足3次,则仅删除匹配的结果即可。
(integer) 1
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE demo 0 -1
1) "F"
2) "F"
3) "E"
4) "D"
5) "D"
6) "D"
7) "D"
8) "B"
9) "A"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
3.使用"DEL"指令删除已经存在的KEY
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11
127.0.0.1:6379[11]> KEYS *
1) "demo"
2) "devops"
3) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> DEL demo
(integer) 1
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> KEYS *
1) "devops"
2) "bigdata"
127.0.0.1:6379[11]>
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
五.列表的应用场景
1.微信朋友圈案例
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 11 --raw
127.0.0.1:6379[11]> KEYS *
demo
devops
bigdata
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH wechat "星期一的朋友圈"
1
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH wechat "星期二的朋友圈"
2
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH wechat "星期三的朋友圈"
3
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH wechat "星期四的朋友圈"
4
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH wechat "星期五的朋友圈"
5
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LPUSH wechat "星期六的朋友圈"
6
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE wechat 0 -1 # 查看所有的朋友圈
星期六的朋友圈
星期五的朋友圈
星期四的朋友圈
星期三的朋友圈
星期二的朋友圈
星期一的朋友圈
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> LRANGE wechat 0 2 # 查看前3天的朋友圈
星期六的朋友圈
星期五的朋友圈
星期四的朋友圈
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> KEYS *
wechat
demo
devops
bigdata
127.0.0.1:6379[11]>
127.0.0.1:6379[11]> QUIT
[root@redis201.oldboyedu.com ~]#
2.list的应用场景总结
(1)消息队列系统;
(2)微信朋友圈动态顺序,最新发表的朋友圈始终在第一条,以往发表的朋友圈会被下移;
温馨提示:
列表的数据结构特点和栈的结构类似,即先进后出。这一点要和python中的列表要做一定的区分哟~