009、Redis的列表(list)数据类型的应用场景
本文最后更新于 395 天前,其中的信息可能已经过时,如有错误请发送邮件到 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中的列表要做一定的区分哟~
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇