本文档风哥主要介绍Redis ZSet类型的排行榜实战项目,包括ZSet类型概念、ZSet操作命令、ZSet使用场景、ZSet排行榜规划、排行榜设计、性能考虑、基础操作、高级操作、范围操作、过期操作以及实战案例等内容,风哥教程参考Redis官方文档Data types guide等内容编写,适合DBA人员和开发人员在生产环境中使用。
Part01-基础概念与理论知识
1.1 ZSet类型概念
Redis ZSet(有序集合)是一个有序的字符串集合,每个元素都有一个分数(score),根据分数进行排序。ZSet类型的特点:
- 有序:根据分数自动排序
- 唯一:不允许存储重复的元素
- 高效:添加、删除、查找操作的时间复杂度都是O(logN)
- 存储容量:最多可以存储2^32-1个元素
1.2 ZSet操作命令
## 1. 基础命令
– ZADD:添加元素到有序集合
– ZREM:从有序集合中删除元素
– ZSCORE:获取元素的分数
– ZRANK:获取元素的排名(按分数从小到大)
– ZREVRANK:获取元素的排名(按分数从大到小)
– ZCARD:获取有序集合元素数量
– ZCOUNT:统计分数范围内的元素数量
## 2. 高级命令
– ZINCRBY:增加元素的分数
– ZRANGE:获取指定范围的元素(按分数从小到大)
– ZREVRANGE:获取指定范围的元素(按分数从大到小)
– ZRANGEBYSCORE:获取分数范围内的元素
– ZREVRANGEBYSCORE:获取分数范围内的元素(按分数从大到小)
– ZREMRANGEBYRANK:删除指定排名范围的元素
– ZREMRANGEBYSCORE:删除指定分数范围的元素
– ZINTERSTORE:求多个有序集合的交集
– ZUNIONSTORE:求多个有序集合的并集
## 3. 过期命令
– EXPIRE:设置有序集合的过期时间
– TTL:查看有序集合的剩余过期时间
– PERSIST:移除有序集合的过期时间
1.3 ZSet使用场景
ZSet类型的使用场景:
- 排行榜:实现各种排行榜,如游戏排名、销售排名等
- 计分系统:存储用户分数、积分等
- 时间序列:存储时间戳数据,实现时间范围查询
- 范围查询:实现基于分数的范围查询
- 优先级队列:根据分数设置优先级
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 ZSet排行榜规划
生产环境ZSet排行榜规划:
- 排行榜命名规范:使用业务前缀+排行榜类型的方式,如rank:game
- 分数设计:根据业务需求设计合理的分数计算规则
- 元素设计:使用唯一标识符作为元素,如用户ID、商品ID等
- 过期时间:根据排行榜的生命周期设置合理的过期时间
2.2 排行榜设计
- 分数计算:根据业务需求设计合理的分数计算规则
- 更新频率:根据业务需求确定排名更新的频率
- 数据量:合理控制排行榜的数据量,避免过大
- 查询性能:优化查询操作,提高排行榜的响应速度
- 多维度:支持多维度的排行榜,如日榜、周榜、月榜等
2.3 性能考虑
## 1. 操作性能
– ZADD:O(logN)
– ZREM:O(logN)
– ZSCORE:O(1)
– ZRANK:O(logN)
– ZRANGE:O(logN + M),M为返回的元素数量
– ZINCRBY:O(logN)
## 2. 性能优化
– 合理控制排行榜的大小
– 优化ZADD和ZINCRBY操作
– 使用合适的范围查询命令
– 避免频繁的全量排行榜查询
## 3. 最佳实践
– 对于大排行榜,使用ZREVRANGE限制返回的元素数量
– 定期清理过期的排行榜数据
– 使用管道批量执行操作
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 基础操作
## 1. 添加元素到有序集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd rank:game 100 1001 200 1002 150 1003 250 1004 180 1005
# 输出示例
(integer) 5
## 2. 从有序集合中删除元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrem rank:game 1003
# 输出示例
(integer) 1
## 3. 获取元素的分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zscore rank:game 1001
# 输出示例
“100”
## 4. 获取元素的排名(按分数从小到大)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrank rank:game 1001
# 输出示例
(integer) 0
## 5. 获取元素的排名(按分数从大到小)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:game 1001
# 输出示例
(integer) 3
## 6. 获取有序集合元素数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zcard rank:game
# 输出示例
(integer) 4
## 7. 统计分数范围内的元素数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zcount rank:game 150 250
# 输出示例
(integer) 3
3.2 高级操作
## 1. 增加元素的分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zincrby rank:game 50 1001
# 输出示例
“150”
## 2. 获取指定范围的元素(按分数从小到大)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrange rank:game 0 -1 withscores
# 输出示例
1) “1001”
2) “150”
3) “1005”
4) “180”
5) “1002”
6) “200”
7) “1004”
8) “250”
## 3. 获取指定范围的元素(按分数从大到小)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:game 0 -1 withscores
# 输出示例
1) “1004”
2) “250”
3) “1002”
4) “200”
5) “1005”
6) “180”
7) “1001”
8) “150”
## 4. 获取分数范围内的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrangebyscore rank:game 150 200 withscores
# 输出示例
1) “1001”
2) “150”
3) “1005”
4) “180”
5) “1002”
6) “200”
## 5. 获取分数范围内的元素(按分数从大到小)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrangebyscore rank:game 200 150 withscores
# 输出示例
1) “1002”
2) “200”
3) “1005”
4) “180”
5) “1001”
6) “150”
## 6. 删除指定排名范围的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zremrangebyrank rank:game 0 1
# 输出示例
(integer) 2
## 7. 删除指定分数范围的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zremrangebyscore rank:game 200 300
# 输出示例
(integer) 2
3.3 范围操作
## 1. 获取Top N元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd rank:score 1000 1001 2000 1002 1500 1003 2500 1004 1800 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:score 0 4 withscores
# 输出示例
1) “1004”
2) “2500”
3) “1002”
4) “2000”
5) “1005”
6) “1800”
7) “1003”
8) “1500”
9) “1001”
10) “1000”
## 2. 获取用户排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:score 1003
# 输出示例
(integer) 3
## 3. 获取用户周围的排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:score 1003
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:score 1 5 withscores
# 输出示例
(integer) 3
1) “1002”
2) “2000”
3) “1005”
4) “1800”
5) “1003”
6) “1500”
7) “1001”
8) “1000”
3.4 过期操作
## 1. 设置有序集合的过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd rank:daily 100 1001 200 1002 150 1003
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire rank:daily 86400
# 输出示例
(integer) 1
## 2. 查看有序集合的剩余过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ttl rank:daily
# 输出示例
(integer) 86399
## 3. 移除有序集合的过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 persist rank:daily
# 输出示例
(integer) 1
风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。
Part04-生产案例与实战讲解
4.1 排行榜实现
## 1. 初始化排行榜
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd rank:game:score 1000 1001 2000 1002 1500 1003 2500 1004 1800 1005
# 输出示例
(integer) 5
## 2. 更新用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zincrby rank:game:score 500 1001
# 输出示例
“1500”
## 3. 获取Top 10排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:game:score 0 9 withscores
# 输出示例
1) “1004”
2) “2500”
3) “1002”
4) “2000”
5) “1005”
6) “1800”
7) “1001”
8) “1500”
9) “1003”
10) “1500”
## 4. 获取用户排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:game:score 1001
# 输出示例
(integer) 3
## 5. 获取用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zscore rank:game:score 1001
# 输出示例
“1500”
## 6. 设置排行榜过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire rank:game:score 604800
# 输出示例
(integer) 1
4.2 用户排名
## 1. 存储用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd rank:user:score 85 1001 92 1002 78 1003 95 1004 88 1005
# 输出示例
(integer) 5
## 2. 获取用户排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:user:score 1001
# 输出示例
(integer) 3
## 3. 获取用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zscore rank:user:score 1001
# 输出示例
“85”
## 4. 获取用户周围的排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:user:score 1001
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:user:score 1 4 withscores
# 输出示例
(integer) 3
1) “1002”
2) “92”
3) “1005”
4) “88”
5) “1001”
6) “85”
7) “1003”
8) “78”
## 5. 更新用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zincrby rank:user:score 5 1001
# 输出示例
“90”
## 6. 重新获取用户排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:user:score 1001
# 输出示例
(integer) 2
4.3 Top N操作
## 1. 获取Top 5用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:user:score 0 4 withscores
# 输出示例
1) “1004”
2) “95”
3) “1002”
4) “92”
5) “1001”
6) “90”
7) “1005”
8) “88”
9) “1003”
10) “78”
## 2. 获取Top 3用户(仅用户ID)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:user:score 0 2
# 输出示例
1) “1004”
2) “1002”
3) “1001”
## 3. 获取分数前3的用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrangebyscore rank:user:score +inf 90 withscores
# 输出示例
1) “1004”
2) “95”
3) “1002”
4) “92”
5) “1001”
6) “90”
## 4. 统计高分用户数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zcount rank:user:score 90 100
# 输出示例
(integer) 3
## 5. 删除低分用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zremrangebyscore rank:user:score 0 80
# 输出示例
(integer) 1
## 6. 查看剩余用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:user:score 0 -1 withscores
# 输出示例
1) “1004”
2) “95”
3) “1002”
4) “92”
5) “1001”
6) “90”
7) “1005”
8) “88”
4.4 排名更新
## 1. 批量更新用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd rank:game:score 3000 1001 2500 1002 3500 1003 2000 1004 4000 1005
# 输出示例
(integer) 5
## 2. 获取更新后的排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:game:score 0 -1 withscores
# 输出示例
1) “1005”
2) “4000”
3) “1003”
4) “3500”
5) “1001”
6) “3000”
7) “1002”
8) “2500”
9) “1004”
10) “2000”
## 3. 实时更新用户分数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zincrby rank:game:score 1000 1004
# 输出示例
“3000”
## 4. 查看更新后的排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrange rank:game:score 0 -1 withscores
# 输出示例
1) “1005”
2) “4000”
3) “1003”
4) “3500”
5) “1001”
6) “3000”
7) “1004”
8) “3000”
9) “1002”
10) “2500”
## 5. 处理并列排名
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:game:score 1001
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrevrank rank:game:score 1004
# 输出示例
(integer) 2
(integer) 3
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 最佳实践
Redis ZSet排行榜实战最佳实践:
- 排行榜命名规范:使用业务前缀+排行榜类型的方式,如rank:game:score,学习交流加群风哥微信: itpux-com
- 分数设计:根据业务需求设计合理的分数计算规则
- 合理设置过期时间:根据排行榜的生命周期设置合适的过期时间
- 批量操作:使用批量命令减少网络开销
- 优化查询:使用ZREVRANGE限制返回的元素数量
- 监控排行榜大小:避免排行榜过大导致内存问题
5.2 常见问题
- 内存使用过高:控制排行榜大小,定期清理过期数据
- 排名更新频繁:合理设计更新频率,避免频繁更新
- 查询性能:使用ZREVRANGE限制返回的元素数量
- 分数计算复杂:优化分数计算逻辑,减少计算开销
- 并排名次:注意ZSet的排名机制,处理并列情况
5.3 优化技巧
## 1. 排行榜设计优化
– 使用简短的排行榜名称和元素值
– 合理设计分数计算规则,确保排名的准确性
– 支持多维度的排行榜,如日榜、周榜、月榜等
– 为不同的业务场景设计不同的排行榜
## 2. 操作优化
– 使用ZADD批量添加元素
– 使用ZINCRBY实时更新分数
– 使用ZREVRANGE获取Top N元素
– 使用管道批量执行操作
## 3. 性能优化
– 监控排行榜大小,及时处理过大的排行榜
– 优化查询操作,减少返回的数据量
– 合理设置过期时间,自动清理过期数据
– 使用多个ZSet存储不同时间维度的排行榜
## 4. 内存优化
– 控制排行榜的大小,避免存储过多数据
– 使用合适的元素值,避免存储过大的元素
– 定期清理过期的排行榜数据
– 选择合适的内存淘汰策略
## 5. 监控优化
– 监控排行榜大小和内存使用
– 监控排行榜操作的执行时间
– 设置排行榜大小告警
– 定期分析排行榜的使用情况
通过本文档的学习,您应该掌握了Redis ZSet类型的排行榜实战项目,能够在生产环境中合理使用ZSet类型实现各种排行榜系统。在实际应用中,需要根据具体业务场景选择合适的操作命令和排行榜设计,确保系统的可靠性和性能。
风哥提示:Redis ZSet类型是实现排行榜的理想选择,它提供了高效的排序功能和丰富的操作命令,适合构建各种排行榜系统。在实际应用中,需要根据业务需求合理设计排行榜结构和更新策略。
from Redis视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
