Redis Sorted Set(有序集合)详解

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
相关推荐
chushiyunen1 小时前
r树索引、mysql对r树的支持
数据库·mysql
Xiacqi11 小时前
Java数据库连接--JDBC--DRUID
数据库·后端
Yushan Bai1 小时前
ORACLE Enterprise Manager Cloud Control 系列测试3-Data Masking
数据库·oracle
罗超驿2 小时前
16.深入理解数据库事务:从转账场景剖析ACID四大特性与回滚(Rollback)机制
数据库·mysql
Yushan Bai2 小时前
ORACLE Enterprise Manager Cloud Control 系列测试2- 日常管理和SQL优化
数据库·oracle
-To be number.wan3 小时前
数据库单表查询全攻略
数据库·学习
文心快码BaiduComate3 小时前
520,Comate Mission模式跨越界限,和你达成最「深」联动
前端·数据库·后端
杨云龙UP3 小时前
Oracle RAC/ODA环境下如何准确查询PDB表空间已分配大小?一次说清Oracle表空间逻辑大小和ASM三副本实际占用_2026-05-19
linux·运维·数据库·sql·oracle·ffmpeg
@nengdoudou3 小时前
KingbaseES数据库MySQL模式使用 “GROUP BY“
数据库·mysql