009、Redis的列表(list)数据类型的应用场景
本文最后更新于 66 天前,其中的信息可能已经过时,如有错误请发送邮件到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
小恐龙
花!
上一篇
下一篇