Redis实现滚动周榜|滚动榜单|直播间榜单|排行榜|Redis实现日榜03

    滚动排行榜与一般排行榜的最大区别在于数据的存储和查询方式。在一般排行榜中,起始点是固定的,例如某一周或某一个月,存储和查询时的时间范围也是固定的。而滚动排行榜则不同,在滚动排行榜中,榜单的取值范围是随着时间的变化而不断变化的。

对于常用的Redis实现方案来说,如果是固定排行榜,我们只需要在每个固定的时间点将数据存入相应的Key中,查询时只需使用一条命令即可获取。因为在同一时间段内的任何一天都属于同一个周期。

然而,对于滚动排行榜,比如近7天榜,每次查询时都需要对今天及前6天的数据进行聚合计算才能得到最新的排行榜结果。在这种情况下,仅仅使用固定的Key无法解决问题,因为数据的存储和查询方式都需要特殊处理,以确保数据能够快速可用。

具体来说,在实现滚动排行榜时,我们可以采取以下策略:

1.存储方式:使用有序集合 (Sorted Set)存储每个时间点的排行榜数据,按照时间顺序存储,最新的数据排在前面。

2.数据更新:每次有新的数据需要加入排行榜时,先将其存入相应的时间点的有序集合中,然后根据设定的时间范围删除过期的数据,以保持榜单数据的更新和滚动。

3.查询方式:为了获得近7天(或其他时间范围)的排行榜数据,需要将对应时间范围内所有的Sorted Set进行聚合操作,计算出最终的排名结果。

通过这种存储和查询方式,我们能够实现滚动排行榜的功能。但是需要注意,在查询时由于需要对多个有序有序进行聚合计算,可能会对性能造成一定的影响,因此在实际实现中需要进行优化,例如增量计算、缓存等手段来提高查询效率。

实现有序集合的第一种方式:

        1. 同时写n天的滚动榜单

实现一个同步写n天滚动榜单的方法,可简单地理解为与固定榜单的实现方式相同。以Redis实现7天滚动方式为例,假设我们每天使用礼物排行榜的键值为"gift_list_cache:20230101",类型选择有序集合 (ZSet)。每当用户获得一个礼物,其对应的价值就会增加,最终用于统计排行榜上主播的总收礼情况。

以下是用户ID为Test0001的用户在获得价值为13140的礼物时,以及获取排行榜数据的示例命令:

// 增加排行榜用户数据
redis.zincrby("gift_list_cache:20231225", 13140, "Test0001");

1.即每天一个键名,将当天的数据写入当天的键中

2.不仅要写入当天的键,还要针对接下来的6天进行写入(ZINCRBY),每次写入操作都按照这个逻辑执行。

类似我们从2023年1月1日开始做滚动榜单,那么在1号这一天我们要插入的榜单就是:

// 增加1号榜单数据
redis.zincrby("gift_list_cache:20230101", 13140, "Test0001");
// 增加2号榜单数据
redis.zincrby("gift_list_cache:20230102", 13140, "Test0001");
// 增加3号榜单数据
redis.zincrby("gift_list_cache:20230103", 13140, "Test0001");
// 增加4号榜单数据
redis.zincrby("gift_list_cache:20230104", 13140, "Test0001");
// 增加5号榜单数据
redis.zincrby("gift_list_cache:20230105", 13140, "Test0001");
// 增加6号榜单数据
redis.zincrby("gift_list_cache:20230106", 13140, "Test0001");
// 增加7号榜单数据
redis.zincrby("gift_list_cache:20230107", 13140, "Test0001");

2号需要插入的榜单数据就是:

// 增加2号榜单数据
redis.zincrby("gift_list_cache:20230102", 13140, "Test0001");
// 增加3号榜单数据
redis.zincrby("gift_list_cache:20230103", 13140, "Test0001");
// 增加4号榜单数据
redis.zincrby("gift_list_cache:20230104", 13140, "Test0001");
// 增加5号榜单数据
redis.zincrby("gift_list_cache:20230105", 13140, "Test0001");
// 增加6号榜单数据
redis.zincrby("gift_list_cache:20230106", 13140, "Test0001");
// 增加7号榜单数据
redis.zincrby("gift_list_cache:20230107", 13140, "Test0001");
// 增加8号榜单数据
redis.zincrby("gift_list_cache:20230108", 13140, "Test0001");

以此类推,那么后面每天都是要插入当天和后面6天的榜单数据,那么这样操作到7号的时候,7号的当天榜单数据就已经是前7天的滚动榜单了。

具体代码实现:

rankScoreUtilManager.addScoreToRank("gift_list_cache:20230101", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));
rankScoreUtilManager.addScoreToRank("gift_list_cache:20230102", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));
rankScoreUtilManager.addScoreToRank("gift_list_cache:20230103", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));
rankScoreUtilManager.addScoreToRank("gift_list_cache:20230104", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));
rankScoreUtilManager.addScoreToRank("gift_list_cache:20230105", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));
rankScoreUtilManager.addScoreToRank("gift_list_cache:20230106", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));
rankScoreUtilManager.addScoreToRank("gift_list_cache:20230107", anchorId, BigDecimal.valueOf(value), EeDateUtil.toDate(eventTime));

 我这里的代码只是为了方便,给大家解释逻辑,(具体榜单的大部分源码可以查看之前的文章:Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01)但是真实开发的时候最好不要这样写,因为这样写并不能保证7个榜单同时插入的原子性,最好把6个榜单的key都写在lua脚本中同步执行。

优点:
1. 实现简单,获取数据也简单,直接获取即可使用。

缺点:
1. 每次写入需要写入多个键名。不将部分写入失败作为缺点是因为其他方案在不严谨的情况下也可能存在此问题。如果只是实现7天榜单,且不想浪费过多精力,可以采用此方案。但是如果天数较多,比如30天滚动榜单,则显然不适合。后续还会介绍另外两种滚动榜单的实现方式。
 

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

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

相关文章

数模学习day01-层次分析法模型

已经一个多月没有更新过文章了,为了保住那绩点的意思微弱的优势,直接开摆,开始复习专业课和公共课考试了,结果虽然有遗憾但是还是算不错,至少没有掉到3.xx嘿嘿。 然后现在就要开始学习数学建模和算法同步了。接下来的文…

element ui Checkbox 多选框组件 lable不支持Object类型的值的问题

浅浅记录一下,遇到这个问题的心理路程吧,首先我遇到的问题是多选框的值回显不打对勾,(例如:你新增的时候多选,然后点击编辑的时候选过的值没有被勾选,其实是被勾选上了,但是没有显示…

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一:fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载:7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…

Zulip:开源团队协作工具,高效沟通与远程办公 | 开源日报 No.126

zulip/zulip Stars: 18.9k License: Apache-2.0 Zulip 是一个开源的团队协作工具,拥有独特的基于主题的线程功能,结合了电子邮件和聊天的优点,使远程工作更加高效和愉快。它是唯一设计用于实时和异步对话的现代团队聊天应用程序。 其核心优势…

ubuntu 系统终端颜色设置

1 开启终端颜色 # 第一步: 在 ~/.bashrc 中设置 force_color_promptyes# 第二步: 执行 source ~/.bashrc2 对于精减的 .bashrc 在 ~/.bashrc 中添加以下内容,再执行 source ~/.bashrc : # uncomment for a colored prompt, if…

Vue 3插槽

Vue 3中的插槽(Slots)是一种强大的模式,用于创建可复用的组件,它允许你将模板插入到组件内部,同时保持组件的封装性和可重用性。在Vue 3中,插槽的使用变得更加灵活和强大。 基本插槽 默认插槽 : 在子组件…

Redis自动部署脚本编写

#!/bin/bash ck_ok() { if [ $? -ne 0 ] then echo "$1 error." exit 1 fi } download_redis() { cd /usr/local/src if [ -f redis-7.0.4.tar.gz ] then echo "当前目录已经存在redis-7.0.4.tar.gz&q…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗? 如果你进行的矩阵乘法涉及一个线性方程组 Ax b,并且你乘以一个可逆矩阵 M,且产生新的方程组 M(Ax) Mb,那么这两个系统是等价的;它们具有相同的解集。这…

RabbitMq知识概述

本文来说下RabbitMq相关的知识与概念 文章目录 概述AMQP协议Exchange 消息如何保证100%投递什么是生产端的可靠性投递可靠性投递保障方案 消息幂等性高并发的情况下如何避免消息重复消费confirm 确认消息、Return返回消息如何实现confirm确认消息return消息机制 消费…

Keil5 新建STM32工程步骤

//************************新建工程************************// 新建文件夹“STM32project”。 打开“Keil5”。 选择“Project”,选择“New uVision Project”,选择“STM32project”文件夹。 输入文件名,选择芯片型号。 //***************…

《数据库开发实践》之存储过程【知识点罗列+例题演练】

一、什么是存储过程? 1.概念理解: 存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句,提供一种封装任务的方法。因此在创建编译好某个存储过程后,因为存储过程中有可执行操作的sql语句,用户可以…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

【机组期末速成】计算机的运算方法|进制转换|无符号数与有符号数|数的定点表示与浮点表示|定点运算

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、日常我们采用十进制来表示数据&#xff0c;计算机如何表示&#xf…

PolarNet: 一种改进的时实激光雷达点云语义分割网格表示方法

PolarNet介绍 github工程代码&#xff1a;https://github.com/edwardzhou130/PolarSeg 点云语义分割在自动驾驶领域的感知模块占据重要地位, 从多年前基于传统的点云聚类和分割,到近些年基于深度学习的点云语义分割方法, 技术逐渐成熟已经进入实时端到端的阶段. 前有基于球面…

无魔搭+ 函数计算: 一键部署,缩短大模型选型到生产的距离

引言 面对魔搭 ModelScope 社区提供的海量模型&#xff0c;用户希望快速进行选型并生产使用起来&#xff0c;但在此之前&#xff0c;却一定会面临算力管理难、模型部署难等一系列问题&#xff0c;那么能否实现快速把选定的模型部署在云端功能强大的 GPU 上&#xff0c;由云端负…

mybatis之TypeHandler,再也不怕数据库与实体类之间的数据转换问题了

mybatis查询转换实体类问题 TypeHandler示例&#xff08;数据类型转换&#xff0c;解决科学计数法问题&#xff09;局部自定义方式全局方式 TypeHandler 类型处理器的基类&#xff0c;MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换&#xff1b;用…

2024,5G-A风起,中兴通讯破浪

对于通信圈而言&#xff0c;2024年最关键的里程碑&#xff0c;当属3GPP R18版本即将冻结。作为5G国际标准化组织&#xff0c;3GPP的意义是推动成员公司、工作组和技术规范的研究&#xff0c;让5G发展更有章法。 放眼整个5G技术的演进&#xff0c;其实大致分为两个阶段。第一阶段…

圆中点算法

中心在原点&#xff0c;半径为 R 的圆的隐式函数方程为 F ( x , y ) x 2 y 2 − R 2 0 F(x, y) x^2 y^2 - R^2 0 F(x,y)x2y2−R20 把像素上的点的坐标代入上述隐式方程 八分法画圆算法 利用坐标轴和与坐标轴夹角 45 度的直线 原理 假设圆弧起点 x 0 x0 x0&#xff0…

ImageProcessing,ComputerVision,DeepLearning中的名词

深度学习,机器学习里有很多名词,它们分别代表什么呢?如下: CV/DL: Computer Vision/Deep Learning 计算机视觉 / 深度学习ML:Machine Learning 机器学习AI: Artificial Intelligence 人工智能ANNs:Artificial Neureal Networks 人工神经网络NN:Neural Network 神经网络…

数模学习02-Matlab基础知识入门

先把matlab下载好。然后你就会发现电脑有少了几十个GB。服啦~ 修改字体 字体真的是太小了&#xff0c;其实我无论是使用什么编辑器我一般都会先改字体&#xff0c;字体在开始中有一个预设&#xff0c;可以修改字体&#xff0c;这样眼睛看着也会舒服一点 命令行窗口的使用 这…