1. 首页 > Redis教程 > 正文

Redis教程FG015-Redis ZSet排行榜实战项目

本文档风哥主要介绍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操作命令

# 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操作

# 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 优化技巧

风哥提示:Redis ZSet类型是实现排行榜的理想选择,它提供了高效的排序功能和丰富的操作命令,适合构建各种排行榜系统。在实际应用中,需要根据业务需求合理设计排行榜结构和更新策略。

# 优化技巧

## 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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息