011、Redis的有序集合(sorted_set)数据类型的应用场景
本文最后更新于 66 天前,其中的信息可能已经过时,如有错误请发送邮件到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操作的所有场景,比如音乐排行榜,动漫热度排行榜等。
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


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