SortedSet结构之用户积分实时榜单实战

news2025/4/6 7:42:48

Redis 中的SortedSet结构非常适合用于实现实时榜单的场景,它根据成员的分数自动进行排序,支持高效的添加、更新和查询操作。

SortedSet实时榜单的一些典型应用场景:

游戏中的玩家排行榜:在多人在线游戏中,使用 SortedSet来维护玩家的得分排行榜,可以按照玩家的得分来排序,方便展示顶级玩家或者好友间的排名情况。

电商热销榜:像淘宝、京东等电商平台的热销商品榜单(例如热销手机、电脑等)。通过 SortedSet可以轻松维护基于销量或其他指标的商品排名,并能快速获取最新的排名信息。

体育赛事积分榜:在体育赛事的应用场景中,利用 SortedSet维护各队伍或运动员的比赛积分、胜率等统计数据的排行榜,以便实时更新和展示最新的排名情况。

下面我们来实战一下用户积分实时榜单!今天实战的内容有查看全部榜单(从大到小);查看前三名的榜单(从大到小);查看某个用户的排名;给某个用户加积分,之后返回所有榜单;查看个人的积分。

对象准备(记得重写HashCode与Equals方法):

public class UserPointVO {
    private String username;
    private String phone;
    public UserPointVO(String username, String phone) {
        this.username = username;
        this.phone = phone;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserPointVO that = (UserPointVO) o;
        return phone.equals(that.phone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(phone);
    }
}

数据准备:

@Test
	void testData() {

		UserPointVO p1 = new UserPointVO("老A","324");
		UserPointVO p2 = new UserPointVO("老B","242");
		UserPointVO p3 = new UserPointVO("老C","542345");
		UserPointVO p4 = new UserPointVO("老D","235");
		UserPointVO p5 = new UserPointVO("老E","1245");
		UserPointVO p6 = new UserPointVO("老F","2356432");
		UserPointVO p7 = new UserPointVO("老G","532332");
		UserPointVO p8 = new UserPointVO("老H","13113");

		BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");

		operations.add(p1,324);
		operations.add(p2,542);
		operations.add(p3,52);
		operations.add(p4,434);
		operations.add(p5,1123);
		operations.add(p6,64);
		operations.add(p7,765);
		operations.add(p8,8);

	}

redis中的数据:

 

我们首先开发返回全部榜单,从大到小的接口:

/**
     *返回全部榜单,从大到小
     * @return
     */
    @RequestMapping("real_rank1")
    public JsonData realRank1(){
        BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");
        Set<UserPointVO> set = operations.reverseRange(0, -1);
        return JsonData.buildSuccess(set);
    }

打印结果为:

 

 接着开发返回前三名榜单的接口:

 /**
     *返回指定大小榜单,从大到小,这里是返回前三名
     * @return
     */
    @RequestMapping("real_rank2")
    public JsonData realRank2(){
        BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");
        Set<UserPointVO> set = operations.reverseRange(0, 2);
        return JsonData.buildSuccess(set);
    }

打印结果为:

 

查看某个用户的排名:

/**
     * 查看某个用户的排名
     * @param name
     * @param phone
     * @return
     */
    @RequestMapping("find_myrank")
    public JsonData realMyRank(String name,String phone){
        BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");
        UserPointVO userPointVO = new UserPointVO(name,phone);
        long rank = operations.reverseRank(userPointVO);
        return JsonData.buildSuccess(++rank);
    }

这里我们查看老H的排名,打印结果为:

 

给某个用户加积分:

/**
     * 给某个用户加积分,之后返回所有榜单
     * @param name
     * @param phone
     * @param point
     * @return
     */
    @RequestMapping("uprank")
    public JsonData upRank(String name,String phone,int point){
        BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");
        UserPointVO userPointVO = new UserPointVO(name,phone);
        operations.incrementScore(userPointVO,point);

        Set<UserPointVO> set = operations.reverseRange(0, -1);
        return JsonData.buildSuccess(set);
    }

这里我们给老H加1000的积分,打印结果为:

 

查看个人的积分:

/**
     * 查看个人的积分
     * @param name
     * @param phone
     * @return
     */
    @RequestMapping("mypoint")
    public JsonData mypoint(String name,String phone){
        BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");
        UserPointVO userPointVO = new UserPointVO(name,phone);
        double score = operations.score(userPointVO);
        return JsonData.buildSuccess(score);
    }

这里我们还是查看老H的积分:

 

 

 

 

 

 

 

 

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329063.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    C++_类和对象(中)

    【本节目标】 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什…

    学习笔记—C++—入门基础()

    目录 C介绍 参考文档 C第一个程序 命名空间namespace namespace的价值 namespace的定义 namespace使用 指定命名空间访问 using将命名空间中某个成员展开 展开命名空间中全部成员 输入和输出 缺省参数 函数重载 引用 引用的概念 应用 const引用 指针和引用的关…

    大数据Spark(五十七):Spark运行架构与MapReduce区别

    文章目录 Spark运行架构与MapReduce区别 一、Spark运行架构 二、Spark与MapReduce区别 Spark运行架构与MapReduce区别 一、Spark运行架构 Master:Spark集群中资源管理主节点&#xff0c;负责管理Worker节点。Worker:Spark集群中资源管理的从节点&#xff0c;负责任务的运行…

    道路裂缝数据集CrackForest-156-labelme

    来源于开源的数据集 https://github.com/cuilimeng/CrackForest-dataset 进行整理修改而成。 文章目录 1. 介绍2. 应用场景3. 相关工具4. 下载地址 1. 介绍 在现代城市管理中&#xff0c;道路状况的监测与维护是确保交通安全和城市基础设施健康的重要环节。 CrackForest是一个…

    Redis数据结构之Hash

    目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表&#xff0c;而且value是一个键值对集合&#xff0c;类似Map<String, Map<…

    故障矩阵像素照片效果ps标题文本特效滤镜样机 Glitched Arcade Text Logo Effect

    有时&#xff0c;视觉效果比文字本身更能讲述故事&#xff0c;因此请确保您已竭尽全力提供令人敬畏的展示。品牌标识或演示元素&#xff0c;该资产可以处理您的项目所涉及的任何内容。由于智能对象图层&#xff0c;此文本效果将为获得理想的结果铺平道路。这些允许您在指定的图…

    [创业之路-352]:从创业和公司经营的角度看:分析美国的三大财务报表

    一、美国政府的财务报表 如果把美国政府看成一个公司&#xff0c;从三大财务报表上看&#xff0c;美国政府资产雄厚&#xff0c;但利润表年年亏损&#xff0c;现金流量表年年为负&#xff0c;现金流持续吃紧&#xff0c;面临现金流断裂导致公司倒闭的风险。 马斯克在降低公司各…

    【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框

    背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…

    OFP--2018

    文章目录 AbstractIntroductionRelated Work2D object detection3D object detection from LiDAR3D object detection from imagesIntegral images 3D Object Detection ArchitectureFeature extractionOrthographic feature transformFast average pooling with integral imag…

    CentOS-查询实时报错日志-查询前1天业务报错gz压缩日志

    最新版本更新 https://code.jiangjiesheng.cn/article/364?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 查询实时报错日志 物理路径&#xff08;带*的放在靠后&#xff0c;或者不用*&#xff09; cd /home/logs/java-gz-log-dir &am…

    ETF 场内基金是什么?佣金最低又是多少呢?

    嘿&#xff0c;朋友们&#xff0c;大家好啊&#xff0c;我是StockMasterX&#xff0c;今天咱们就坐下来慢慢聊聊这个话题&#xff0c;ETF 场内基金到底是个啥东西&#xff0c;它的佣金最低能到多少&#xff0c;真的是个值得深挖的问题。 说起ETF&#xff0c;我还记得刚入行那会…

    [论文阅读]PMC-LLaMA: Towards Building Open-source Language Models for Medicine

    PMC-LLaMA&#xff1a;构建医学开源语言模型 摘要 最近&#xff0c;大语言模型在自然语言理解方面展现了非凡的能力。尽管在日常交流和问答场景下表现很好&#xff0c;但是由于缺乏特定领域的知识&#xff0c;这些模型在需要精确度的领域经常表现不佳&#xff0c;例如医学应用…

    26考研——线性表(2)

    408答疑 文章目录 一、线性表的定义和基本操作二、线性表的顺序表示三、 线性表的链式表示四、 顺序表和链表的比较五、参考资料鲍鱼科技课件26王道考研书 六、总结顺序表总结顺序表特点深入掌握顺序表的管理方式 单链表总结双循环链表总结 一、线性表的定义和基本操作 文章链…

    低代码开发平台:飞帆画 echarts 柱状图

    https://fvi.cn/711 柱状图这个控件是由折线图的控件改过来的&#xff0c;在配置中&#xff0c;单选框选择柱状图就行了。

    PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限

    如果你用Mac管理照片&#xff0c;大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启&#xff0c;想合并照片得手动导出导入&#xff0c;重复文件更是无处可逃…… 直到我发现了 PowerPhotos&#xff0c;这款专为Mac设计的照片库管理…

    Linux 下 日志系统搭建全攻略

    目录 一、引言 二、日志系统基础 日志级别 日志输出格式 三、创建日志所需函数 认识可变参数 ​编辑 获取时间的函数 小结 四、创建日志 一、引言 在 Linux 环境中开发 C/C 程序时&#xff0c;日志系统是不可或缺的一部分。它不仅有助于调试程序、排查问题&#xff…

    Linux系统安装Postgre和Postgis教程

    卸载 如果之前没装过可以忽略这一步 卸载前记得备份数据库数据(如果还需要的话)&#xff01;&#xff01;&#xff01; 一、删除 Docker 安装的 PostgreSQL/PostGIS 1. 停止并删除容器 # 查看所有容器 docker ps -a | grep postgres# 停止并删除容器&#xff08;替换为实际…

    LXC 导入多Linux系统

    前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<

    6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)

    『STEMA考试是蓝桥青少教育理念的一部分&#xff0c;旨在培养学生的知识广度和独立思考能力。考试内容主要考察学生的未来STEM素养、计算思维能力和创意编程实践能力。』 一、选择题 第一题 运行下列哪个程序后&#xff0c;飞机会向左移动&#xff1f; ( ) A. …

    使用Webpack搭建React项目:从零开始

    &#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…