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 进行数据的持久化存储,可以在保证性能的同时确保数据的可靠性。
相关文章:
Redis 有序集合【实现排行榜】
使用 Redis 的 Sorted Set 数据结构可以非常高效地实现实时排行榜功能。Sorted Set 允许将元素按分数进行排序,同时支持插入、删除和查询操作,且这些操作的时间复杂度较低,非常适合处理高并发的场景。 实现思路 插入操作:当用户…...
ORACLE数据库管理系统介绍
1.ORACLE的特点: 可移植性 ORACLE采用C语言开发而成,故产品与硬件和操作系统具有很强的独立性。从大型机到微机上都可运行ORACLE的产品。可在UNIX、DOS、Windows等操作系统上运行。可兼容性 由于采用了国际标准的数据查询语言SQL,与IBM的SQL/DS、DB2等均兼容。并提供读取其它…...
C# 中Linq探讨 Or条件拼接
在C#中,没有直接内置于.NET Core或.NET Framework中的NuGet包能够直接“拼接”LINQ的OR条件,因为LINQ本身设计为一种声明式编程模型,用于查询数据集合。然而,你可以通过一些方式来实现多个条件以OR逻辑组合的效果,而不…...
有关应用层面试题有关库的思维导体
面试题目: TCP通信中3次握手和四次挥手? 答: 第一次握手:客户端发送SYN包(SYN1, seq0)给服务器,并进入SYN_SENT状态,等待服务器返回确认包。第二次握手:服务器接收到S…...
记一次 SAP BP 编号范围错误引发的一个问题 GET_NRIV_LINE
本来想着循着错误提示去排查,但是还是想看看业务发生了什么,他们的操作是否有问题,不经意间发现 号码段是有问题的,由此大概可以判断是他们编号范围和类型之间的问题 角色和分组是否一致的,如果不一致就发生了以上错误…...
(17)ELK大型储存库的搭建
前言: els是大型数据储存体系,类似于一种分片式存储方式。elasticsearch有强大的查询功能,基于java开发的工具,结合logstash收集工具,收集数据。kibana图形化展示数据,可以很好在大量的消息中准确的找到符…...
每日一问:Kafka消息丢失与堆积问题分析(简化版)
Kafka 消息系统问题解析 在本篇博客中,我们将深入探讨 Kafka 中常见的两大问题:消息丢失和消息堆积。首先,我们将简要介绍 Kafka 的基本工作原理,随后分别分析消息丢失和堆积的原因,并提供针对性的解决方案。 关于其详…...
C语言中函数sizeof和strlen区别
sizeof和strlen是C语言中的两个常用函数,它们的作用和使用方式有所不同。 sizeof sizeof是一个运算符而非函数,用于计算数据类型或变量占用的字节数。它可以计算任意数据类型(包括基本类型、自定义结构体、数组等)的大小。例如&…...
RAG与LLM原理及实践(14)---- Python + MinIO + Kafka进阶
目录 背景 根因分析 配置 构造 创建 network 构造 zookeeper 构造 kafka 参数构造 原理解析 图解 全过程解析 工具使用 kafkacat 查看 broker python 实现 python send + kafka recv python 代码 kafka recv 运行效果 python recv + kafka send python 代…...
接口自动化-代码实现
接口自动化基础 1、接口自动化测试 接口自动化:使用工具或代码代替人对接口进行测试的技术测试目的: 防止开发修改代码时引入新的问题测试时机: 开发进行系统测试转测前,可以先进行接口自动化脚本的编写开发进行系统测试转测后&…...
如何查看linux大文件
文章目录 一、查看存储情况二、查看指定路径下的文件大小查看临时文件和日志的大小 三、查找home目录下文件大小大于100M的大文件四、查看INNODE使用情况五、查看进程使用情况查看所有进程查看特定进程杀死相关进程 六、清除缓存操作七、 查看docker的硬盘占用情况详细查看 一、…...
生成式人工智能服务大模型备案答疑
问:大模型备案范围 答:利用生成式人工智能技术向中华人民共和国境内公众提供生成文本、图片、音频、视频等内容的服务,适用本办法。 未向境内公众提供生成式人工智能服务的,不适用本办法的规定。 ps:生成式人工智能…...
QT-贪吃蛇小游戏
QT-贪吃蛇小游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "Food.h" #include <QTime> #include <time.h> #include "Snake.h"Food::Food(int foodSize):foodSize(foodSize) {coordinate.x -1;coordinate.…...
虚幻5|AI视力系统,听力系统,预测系统(1)视力系统
继宠物伴随系统初步篇后续 虚幻5|AI巡逻宠物伴随及定点巡逻—初步篇-CSDN博客 一,听力系统 1.打开宠物ai的角色蓝图 2.选中ai感知组件 右侧细节,找到ai感知,添加感知配置,我们需要的是ai视力配置 3.选中左侧创建的ai感知组件&…...
IC rankIC
IC IC衡量的是预测值和实际值之间的相关系数 计算公式为:IC Pearson(R(predicted),R(actual)) 取值范围:[-1, 1],其中1表示完全相关,也就是预测值和实际值完全一样。0表示完全不相关,-1表示,反向相关 ra…...
Windows服务器IIS7下如何查看真实报错原因
背景 IIS7默认为友好报错,或只报错代码。如500错误,401错误等。根据这些错误无法定位真实原因,故而需要显示真实的错误信息。 解决方案 以500错误为例说明。 1、打开IIS,点全局设置中的"错误页"(注意必须是全局网站)。 2、右击50…...
深度学习设计模式之策略模式
文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 策略模式定义一系列算法,封装每个算法,并使它们可以互换。 一、介绍 策略模式(Strategy Pattern)是一种行为型设计模式&…...
Linux 下安装miniconda(少走弯路)
Miniconda 和 Conda 都是用于管理 Python(及其他语言)环境和包的工具。 conda对于我来说是太臃肿了,很多的包我不会使用,所以选择安装miniconda是一个较好的选择。 下面是linux安装miniconda的实际操作。 在以下的网站…...
java ssl使用自定义证书
1.证书错误 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 2.生成客户端证书 openssl x509 -in <(openssl s_client -connect 192.168.11.19:8101 -prexit 2>/dev/null) -ou…...
【ARM+Codesys 客户案例 】基于RK3568/A40i/STM32+CODESYS开发的控制器在自动输送分拣系统上的应用,支持定制
2021年“京东618” 累计下单金额超3438亿元,再次刷新纪录! 从下单到收货,各种货品均可在短短几天内通过四通八达的物流网络送达全国任何一个家庭。电子商务和快递物流的迅猛发展对仓储、分拣、配送效率和准确性均提出了更高的要求,加速了智能物流的发展。…...
【无人机控制】基于matlab人工势场法的四旋翼无人机轨迹规划几何控制器【含Matlab源码 15252期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
基于Spark+Hadoop+Hive 深度学习大数据的运河航运效率提升平台的设计与实现
前言随着全球贸易的不断发展,运河航运作为连接内陆与海洋的重要交通方式,其运输效率的提升对于促进经济发展、优化资源配置具有重要意义。基于大数据的运河航运效率提升平台的设计与实现,旨在通过收集、处理和分析大量的航运数据,…...
nuScenes数据集避坑指南:从数据下载到多模态可视化完整流程
nuScenes数据集实战全解析:从环境搭建到多模态融合可视化 自动驾驶研究离不开高质量的数据集支持,而nuScenes作为目前最全面的多模态自动驾驶数据集之一,包含了丰富的传感器数据和精细的标注信息。但在实际使用过程中,从数据下载到…...
抖音批量下载终极指南:一键获取无水印视频与创作者全部作品
抖音批量下载终极指南:一键获取无水印视频与创作者全部作品 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...
从线索到成交,陀螺匠帮我打通了客户管理全流程
作为一个从业多年销售,我觉得我在管理客户过程中遇到的这些问题,很多企业多多少少也出现过。比如销售小王跟了一个月的客户,最后发现小李早就联系过了,经常白忙活;好不容易谈成的单子,合同改来改去…...
ARM Cortex-M嵌入式通用头文件sarmfsw深度解析
1. sarmfsw项目概述sarmfsw(ARM-based Common Headers)是一个面向ARM Cortex-M系列微控制器的轻量级、跨平台通用头文件集合。它并非传统意义上的功能库,而是一套经过工程验证的类型定义(typedefs)、宏(mac…...
Phi-4-reasoning-vision-15B部署教程:开源大模型镜像适配国产GPU方案
Phi-4-reasoning-vision-15B部署教程:开源大模型镜像适配国产GPU方案 1. 模型介绍 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型,具备强大的图像理解和分析能力。这个15B参数规模的模型特别擅长处理需要结合视觉和语言理解的复杂任务。 …...
解锁智能OCR新范式:Pix2Text多模态内容识别技术全解析
解锁智能OCR新范式:Pix2Text多模态内容识别技术全解析 【免费下载链接】Pix2Text Pix In, Latex & Text Out. Recognize Chinese, English Texts, and Math Formulas from Images. 项目地址: https://gitcode.com/gh_mirrors/pi/Pix2Text Pix2Text是一款…...
5个Rust驱动特性解决存储清理难题:Czkawka技术深度解析
5个Rust驱动特性解决存储清理难题:Czkawka技术深度解析 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka Czkawka是一款基于Rust语言开发…...
实战应用:基于快马AI与OpenClaw构建Mac本地电商价格监控系统
最近在做一个电商价格监控的小工具,发现用OpenClaw配合Mac本地环境搭建特别方便。这里分享一下我的实战经验,希望能帮到有类似需求的同学。 为什么选择OpenClaw OpenClaw是个轻量级的Python爬虫框架,特别适合需要快速搭建数据采集系统的场景…...
