本文最后更新于 257 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
Redis的有序集合(sorted_set)数据类型的应用场景
一.有序集合(sorted_set)的增加指令
1.使用"ZADD"指令创建有序集合,若集合已经存在则直接添加对应元素及其分数。
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZADD bigdata 100 hadoop 200 spark 300 flink # 如果KEY不存在则会创建相应的KEY,并往有序集合添加3个元素的同时也向这些元素设置相应的分数。
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> KEYS *
bigdata
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES # 注意观察其顺序, 默认是基于分数升序排序输出的哟~
hadoop
100
spark
200
flink
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZADD bigdata 400 hive 500 impala
2
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
spark
200
flink
300
hive
400
impala
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZADD bigdata 300 mysql 500 impala 500 kafka # 如果添加已经存在的KEY,则会自动去重哟~
2
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
spark
200
flink
300
mysql
300
hive
400
impala
500
kafka
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
二.有序集合的查看指令
1.使用"ZRANGE"指令基于分数升序查看有序集合中的成员及分数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZADD bigdata 500 flink 100 hadoop 300 spark 400 clickhouse 200 impala
5
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> KEYS *
bigdata
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 0 # 查看bigdata中的第一个元素,无论执行多少次,始终拿到的是第一个元素,这是由于其分数最小!
hadoop
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 0
hadoop
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 0
hadoop
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 0 WITHSCORES # 查看第一个元素,并显示其分数!
hadoop
100
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 # 只查看集合的成员。其中0代表第一个元素,-1代表最后一个元素
hadoop
impala
spark
clickhouse
flink
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES # 不仅查看集合的成员,还查看集合中的分数。
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"ZREVRANGE"指令基于分数降序查看有序集合中的成员及分数,可以实现TOPN
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGE bigdata 0 -1 # 基于分数降序查看有序集合中的元素
flink
clickhouse
spark
impala
hadoop
127.0.0.1:6379[13]>
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGE bigdata 0 -1 WITHSCORES
flink
500
clickhouse
400
spark
300
impala
200
hadoop
100
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGE bigdata 0 0 WITHSCORES # 获取TOP1
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGE bigdata 0 2 WITHSCORES # 获取TOP3
flink
500
clickhouse
400
spark
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
3.使用"ZRANK"指令查看某个元素在有序集合中存储的索引位置
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANK bigdata spark # 获取spark元素在集合中的索引位置,索引下标是从0开始逐一递增的哟~
2
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANK bigdata impala
1
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANK bigdata flink
4
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANK bigdata hadoop
0
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
4.使用"ZCARD"指令获取有序集合的长度
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1
hadoop
impala
spark
clickhouse
flink
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZCARD bigdata # 获取有序集合的长度
5
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
5.使用"ZCOUNT key min max"指令获取分数大于等于"min"和小于等于"max"的元素个数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZCOUNT bigdata 200 400 # 获取分数大于等于200和小于等于400的元素个数
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
6.使用"ZSCORE"指令获取元素在有序集合中的分数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZSCORE bigdata flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZSCORE bigdata spark
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
7.使用"ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]"指令获取分数大于等于"min"和小于等于"max"的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZCOUNT bigdata 200 400 # 获取分数大于等于200和小于等于400的元素个数
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGEBYSCORE bigdata 200 400 # 获取分数大于等于200和小于等于400的元素
impala
spark
clickhouse
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGEBYSCORE bigdata 200 400 WITHSCORES # 获取分数大于等于200和小于等于400的元素并显示分数
impala
200
spark
300
clickhouse
400
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGEBYSCORE bigdata 200 400 WITHSCORES LIMIT 0 1 # 获取分数大于等于200和小于等于400的第1个元素
impala
200
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGEBYSCORE bigdata 200 400 WITHSCORES LIMIT 0 2 # 获取分数大于等于200和小于等于400的前2个元素
impala
200
spark
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGEBYSCORE bigdata 200 400 WITHSCORES LIMIT 1 2 # 获取分数大于等于200和小于等于400的元素中,以第1个元素为偏移量2个的元素。
spark
300
clickhouse
400
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
8.使用"ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]"指令获取分数小于等于"max"和大于等于"min"的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZREVRANGE bigdata 0 -1 WITHSCORES
flink
500
clickhouse
400
spark
300
impala
200
hadoop
100
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGEBYSCORE bigdata 400 200
clickhouse
spark
impala
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGEBYSCORE bigdata 400 200 WITHSCORES # 查看有序结合中分数小于等于400大于等于200的元素。
clickhouse
400
spark
300
impala
200
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGEBYSCORE bigdata 400 200 WITHSCORES LIMIT 0 1 # 偏移量从0索引开始,只查看第一个。
clickhouse
400
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGEBYSCORE bigdata 400 200 WITHSCORES LIMIT 0 2 # 偏移量从0索引开始,只查看前两个。
clickhouse
400
spark
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGEBYSCORE bigdata 400 200 WITHSCORES LIMIT 1 1
spark
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGEBYSCORE bigdata 400 200 WITHSCORES LIMIT 1 2
spark
300
impala
200
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
三.有序集合的修改指令
1.使用"ZINCRBY"指令为元素增加指定的分数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
bigdata
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
spark
200
flink
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZINCRBY bigdata 300 spark # 将spark这个元素的分数增加500分,并返回该元素更新后的分数
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES # 注意观察,原有序集合的数据也发生的变化哟~
hadoop
100
flink
300
spark
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
四.有序集合的删除指令
1.使用"ZREM"指令删除有序集合中的元素
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
bigdata
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
spark
200
flink
300
mysql
300
hive
400
impala
500
kafka
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREM bigdata kafka # 删除bigdata的KEY中名为kafka的元素。
1
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
spark
200
flink
300
mysql
300
hive
400
impala
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREM bigdata kafka impala hive mysql # 删除多个元素,尽管我们想要删除的元素不存在也不会保存,只不过会自动忽略不存在的元素(我这里特指上面已经删除的"kafka")
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
spark
200
flink
300
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
2.使用"ZREMRANGEBYSCORE key min max"指令删除基于分数大于等于"min"和小于等于"max"的元素,并返回删除的个数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREMRANGEBYSCORE bigdata 200 400 # 删除分数大于等于200和小于等于400的元素,并返回删除的个数
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES # 很明显,的确是删除了3个元素哟~
hadoop
100
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
3.使用"ZREMRANGEBYRANK key start stop"指令删除基于索引大于等于"start"和小于等于"stop"的元素,并返回删除的个数
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES
hadoop
100
impala
200
spark
300
clickhouse
400
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREMRANGEBYRANK bigdata 1 3 # 删除索引大于1小于等于3的元素,并返回删除元素的个数
3
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZRANGE bigdata 0 -1 WITHSCORES # Duang~很明显程序的确被删除成功啦!
hadoop
100
flink
500
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
五.有序集合的应用场景
1.音乐,动漫排行榜模拟
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -n 13 --raw
127.0.0.1:6379[13]> KEYS *
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZADD music 100 白月光与朱砂痣 3000 稻香 2000 泡沫 500 天涯 8000 千里之外 10000 光年之外
6
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZADD cartoon 1500000000 斗罗大陆 300000000 斗破苍穹 24000000 画江湖之不良人 820000000 火影忍者
4
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> KEYS *
cartoon
music
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGE music 0 2 WITHSCORES # 查看音乐排行榜前三的歌曲
光年之外
10000
千里之外
8000
稻香
3000
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> ZREVRANGE cartoon 0 2 WITHSCORES # 查看动漫排行榜前三的动画片
斗罗大陆
1500000000
火影忍者
820000000
斗破苍穹
300000000
127.0.0.1:6379[13]>
127.0.0.1:6379[13]> QUIT
[root@redis201.oldboyedu.com ~]#
2.Redis应用场景案例总结
排行榜应用,取TOPN操作的所有场景,比如音乐排行榜,动漫热度排行榜等。