当前位置: 首页 > news >正文

Redis 有序集合【实现排行榜】

使用 Redis 的 Sorted Set 数据结构可以非常高效地实现实时排行榜功能。Sorted Set 允许将元素按分数进行排序,同时支持插入、删除和查询操作,且这些操作的时间复杂度较低,非常适合处理高并发的场景。

实现思路

  • 插入操作:当用户产生分数时,将用户 ID 和分数插入到 Redis 的 Sorted Set 中。
  • 查询操作:根据用户分数在排行榜中的位置,获取某个用户的排名或获取前 N 名的用户列表。

1. 创建排行榜表结构

首先,在 MySQL 中创建一个存储用户和分数的表,以便持久化保存数据

CREATE TABLE user_scores (user_id INT PRIMARY KEY,score INT NOT NULL
);

2. 插入分数到排行榜

当用户获得分数时,将用户 ID 和分数插入到 Redis 的 Sorted Set 中。

<?php
function addScoreToLeaderboard($userId, $score) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);// 将用户ID和分数插入到Sorted Set中$redis->zAdd('leaderboard', $score, $userId);// 更新MySQL中的持久化数据$db = new mysqli('localhost', 'username', 'password', 'database');$stmt = $db->prepare("INSERT INTO user_scores (user_id, score) VALUES (?, ?) ON DUPLICATE KEY UPDATE score = ?");$stmt->bind_param("iii", $userId, $score, $score);$stmt->execute();
}// 示例:将用户123的分数更新为500
addScoreToLeaderboard(123, 500);

3. 查询用户的排名

根据用户的分数,查询其在排行榜中的排名。Redis 的 zRevRank 命令返回的是从高到低的排名。

<?php
function getUserRank($userId) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);// 获取用户的排名(Redis 的排名从0开始,所以加1)$rank = $redis->zRevRank('leaderboard', $userId);return $rank !== false ? $rank + 1 : null;
}// 示例:获取用户123的排名
$rank = getUserRank(123);
echo "User 123's rank: " . $rank . "\n";

4. 获取排行榜前 N 名

通过 Redis 的 zRevRange 命令获取排行榜前 N 名的用户。

<?php
function getTopNUsers($n) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);// 获取前N名用户ID及其分数$topUsers = $redis->zRevRange('leaderboard', 0, $n - 1, true);return $topUsers;
}// 示例:获取排行榜前10名
$topUsers = getTopNUsers(10);
print_r($topUsers);

5. 更新分数和排名

如果用户的分数需要更新,可以直接通过 zAdd 命令更新 Redis 中的分数,排行榜会自动调整顺序。

<?php
function updateScore($userId, $newScore) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);// 更新用户的分数$redis->zAdd('leaderboard', $newScore, $userId);// 更新MySQL中的持久化数据$db = new mysqli('localhost', 'username', 'password', 'database');$stmt = $db->prepare("UPDATE user_scores SET score = ? WHERE user_id = ?");$stmt->bind_param("ii", $newScore, $userId);$stmt->execute();
}// 示例:更新用户123的分数为600
updateScore(123, 600);

6. 实时排行榜特性

Redis 的 Sorted Set 能够以 O(log(N)) 的时间复杂度完成插入和删除操作,以 O(log(N) + M) 的时间复杂度完成范围操作(M 是范围内元素的数量)。这种特性使得它非常适合用于高并发环境下的排行榜应用。

7. 扩展功能

  • 分页查询:使用 zRevRange 结合起始和结束索引可以实现分页获取排行榜用户。
  • 批量插入:如果有多个用户需要同时插入或更新分数,可以使用 Redis 的管道(pipeline)机制,提高操作效率。
  • 持久化管理:定期将 Redis 中的数据同步回 MySQL,以防止数据丢失。

总结

通过 Redis 的 Sorted Set 实现实时排行榜,不仅操作简单、效率高,而且非常适合处理高并发的场景。将用户的分数与排名存储在 Redis 中,结合 MySQL 进行数据的持久化存储,可以在保证性能的同时确保数据的可靠性。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ARM+Codesys 客户案例 】基于RK3568/A40i/STM32+CODESYS开发的控制器在自动输送分拣系统上的应用,支持定制
  • 大数据开发工程师面试整理-性能优化
  • 细数目标管理的坑:避免陷阱,实现高效执行
  • Oracle-OraclePartition
  • Unity | 游戏开发中的优化思维
  • 使用微软Detours库进行DLL注入
  • 【JAVA】阿里巴巴 EasyExcel:高效的Excel处理解决方案
  • 【java】RuoYi-Vue前后端分离版本-登陆请求流程解析
  • OpenAI推出GPT-4o微调功能
  • Nuitka 打包 exe 软件步骤
  • JSON, YAML, XML, CSV交互可视化
  • 设计模式六大原则(一)--单一职责原则
  • 一站式NVR模组解决方案:基于海思 3520D芯片的完整源码与系统集成
  • 基于Python的机器学习系列(7):多元逻辑回归
  • GT IP中的Sequence Max Skew
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【EOS】Cleos基础
  • 2017-09-12 前端日报
  • Bootstrap JS插件Alert源码分析
  • C++11: atomic 头文件
  • ES10 特性的完整指南
  • express如何解决request entity too large问题
  • JAVA多线程机制解析-volatilesynchronized
  • Spring-boot 启动时碰到的错误
  • ViewService——一种保证客户端与服务端同步的方法
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 高程读书笔记 第六章 面向对象程序设计
  • 计算机在识别图像时“看到”了什么?
  • 警报:线上事故之CountDownLatch的威力
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端攻城师
  • 如何优雅地使用 Sublime Text
  • 用Visual Studio开发以太坊智能合约
  • 再次简单明了总结flex布局,一看就懂...
  • scrapy中间件源码分析及常用中间件大全
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #include到底该写在哪
  • #微信小程序:微信小程序常见的配置传值
  • (0)Nginx 功能特性
  • (06)Hive——正则表达式
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)http-server应用
  • (转)大型网站架构演变和知识体系
  • .htaccess配置重写url引擎
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET Micro Framework初体验
  • .NET 给NuGet包添加Readme
  • .NET实现之(自动更新)