Redis 里面有一种非常强大的数据结构:
txt
Sorted Set(有序集合)
简称:
txt
ZSet
这是 Redis 面试和项目里非常高频的东西。
一、什么是 Sorted Set
先记住一句话:
txt
Sorted Set = 自动排序的 Set
它具备:
txt
Set 的去重
+
自动排序
两个特性。
二、为什么需要 Sorted Set
普通 Set:
txt
只能去重
不能排序
例如:
txt
张三
李四
王五
但是:
很多场景:
txt
需要排名
需要分数
需要排行榜
例如:
| 用户 | 分数 |
|---|---|
| 张三 | 100 |
| 李四 | 80 |
| 王五 | 120 |
这时候:
txt
Sorted Set 就非常适合
三、Sorted Set 的结构
它本质:
txt
value + score
例如:
txt
zhangsan -> 100
lisi -> 80
wangwu -> 120
Redis 会:
txt
根据 score 自动排序
四、为什么叫 ZSet
Redis 命令:
txt
Sorted Set
前面都带:
txt
Z
例如:
txt
ZADD
ZRANGE
ZREM
所以:
很多人直接叫:
txt
ZSet
五、Sorted Set 最大特点
1. 自动排序
Redis 自动按 score 排序。
2. 元素唯一
和 Set 一样:
txt
value 不能重复
3. 可以范围查询
例如:
txt
前10名
分数100以上
非常适合排行榜。
六、Sorted Set 最经典场景
1. 游戏排行榜
txt
用户 -> 分数
2. 热搜榜
txt
关键词 -> 热度
3. 点赞排行
txt
文章 -> 点赞数
4. 直播打赏榜
txt
用户 -> 打赏金额
七、核心命令
最核心:
txt
ZADD
ZRANGE
ZREM
ZSCORE
八、添加数据(ZADD)
bash
ZADD rank 100 zhangsan
意思:
txt
往 rank 这个有序集合里
添加:
zhangsan -> 100
再添加
bash
ZADD rank 80 lisi
ZADD rank 120 wangwu
现在:
txt
rank:
lisi -> 80
zhangsan -> 100
wangwu -> 120
Redis 自动排序。
九、查看数据(ZRANGE)
从小到大
bash
ZRANGE rank 0 -1
输出:
txt
lisi
zhangsan
wangwu
十、为什么是 0 -1
Redis:
txt
0 = 第一个
-1 = 最后一个
所以:
txt
0 -1
表示:
txt
全部数据
十一、查看分数
bash
ZRANGE rank 0 -1 WITHSCORES
输出:
txt
lisi 80
zhangsan 100
wangwu 120
十二、倒序排行榜(重点)
排行榜:
一般:
txt
分数高的在前面
所以:
使用:
bash
ZREVRANGE rank 0 9 WITHSCORES
意思:
txt
按分数从大到小
取前10名
十三、删除元素
bash
ZREM rank lisi
删除:
txt
lisi
十四、获取分数
bash
ZSCORE rank zhangsan
输出:
txt
100
十五、获取排名(重点)
从小到大排名
bash
ZRANK rank zhangsan
从大到小排名
bash
ZREVRANK rank zhangsan
排行榜开发里:
非常常见。
十六、Redis 为什么适合排行榜
因为:
Sorted Set 底层:
txt
跳表 + 哈希表
查询排名速度:
非常快。
十七、Go 操作 Sorted Set
Go Redis:
go
github.com/redis/go-redis/v9
十八、添加数据
go
rdb.ZAdd(ctx, "rank", redis.Z{
Score: 100,
Member: "zhangsan",
})
十九、再添加
go
rdb.ZAdd(ctx, "rank",
redis.Z{Score: 80, Member: "lisi"},
redis.Z{Score: 120, Member: "wangwu"},
)
二十、获取排行榜
go
result, _ := rdb.ZRevRangeWithScores(ctx, "rank", 0, 9).Result()
fmt.Println(result)
二十一、返回结果
类似:
txt
[{wangwu 120} {zhangsan 100} {lisi 80}]
说明:
txt
已经自动排序
二十二、Sorted Set 底层思想
你要理解:
Sorted Set 本质:
不是:
txt
普通数组排序
而是:
txt
Redis 内部维护有序结构
所以:
txt
插入时就已经排序好了
二十三、为什么比 MySQL 快
如果 MySQL 做排行榜:
sql
ORDER BY score DESC
数据量大:
会很慢。
Redis:
txt
天然维护有序结构
所以:
排行榜场景:
Redis 非常强。
二十四、实际项目案例
热搜榜
txt
mysql
redis
go
gin
热度:
txt
mysql -> 1000
redis -> 1500
go -> 900
存进:
txt
ZSet
然后:
bash
ZREVRANGE hot 0 9
直接:
txt
获取热搜前10
二十五、总结
Sorted Set 本质:
txt
带分数的自动排序集合
核心结构:
txt
member + score
核心特点:
txt
自动排序
元素唯一
支持排名
支持范围查询
最经典场景:
txt
排行榜
热搜榜
积分榜
点赞榜
核心命令:
| 命令 | 作用 |
|---|---|
| ZADD | 添加 |
| ZRANGE | 正序查看 |
| ZREVRANGE | 倒序查看 |
| ZREM | 删除 |
| ZSCORE | 查看分数 |
| ZRANK | 查看排名 |
真实开发:
txt
只要涉及排行榜
几乎都会想到 Redis Sorted Set