用redis的zset实现日榜,周榜,月榜

思路:

请添加图片描述

1.初始化一个月的数据:

 /*** 初始化一个月数据*/@Testpublic void initMonthData(){//计算当前时间小时的keylong hour=System.currentTimeMillis()/(1000*60*60);for(int i=1;i<24*30;i++){String key="W_hour"+(hour-i);Random random =new Random();for(int j=1;j<=26;j++){stringRedisTemplate.opsForZSet().add(key,"player"+j, random.nextDouble());}}}

2.代码实现:

@RestController
@RequestMapping("/testW")
@Slf4j
public class testW {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@PostConstructpublic  void init(){log.info("定时任务启动");//定时五秒刷新点赞次数new Thread(()->this.refreshDataHour()).start();//定时一小时合并日榜 周榜月榜new Thread(()->this.refreshData()).start();}/*** 获取日榜前topN**/@PostMapping("/getDayTopN")public Set<ZSetOperations.TypedTuple<String>> getDayTopN(int topN) {return  this.stringRedisTemplate.opsForZSet().reverseRangeWithScores("W_day", 0, topN - 1);}/*** 获取周榜前topN*/@PostMapping("/getWeekTopN")public Set<ZSetOperations.TypedTuple<String>> getWeekTopN(int topN) {return  this.stringRedisTemplate.opsForZSet().reverseRangeWithScores("W_week", 0, topN - 1);}/*** 获取月榜前topN*/@PostMapping("/getMonthTopN")public Set<ZSetOperations.TypedTuple<String>> getMonthTopN(int topN) {return  this.stringRedisTemplate.opsForZSet().reverseRangeWithScores("W_month", 0, topN - 1);}/*** 定时五秒刷新点赞次数*/public void  refreshDataHour(){while(true){long  hour=System.currentTimeMillis()/(1000*60*60);Random rand =new Random();for(int i=1;i<=26;i++){this.stringRedisTemplate.opsForZSet().incrementScore("W_hour"+hour,"player"+i,rand.nextDouble());}try{Thread.sleep(5000);}catch (InterruptedException e){e.printStackTrace();}}}/*** 定时一小时合并日榜 周榜 月榜*/public void  refreshData(){while(true) {//日榜this.refreshDay();//周榜this.refreshWeek();//月榜this.refreshMonth();try {Thread.sleep(1000 * 60 * 60);} catch (InterruptedException e) {e.printStackTrace();}}}/*** 日榜*/public void  refreshDay(){long  hour =System.currentTimeMillis()/(1000*60*60);//合并一天的keyList<String> keys=new ArrayList<>();for(int i=1;i<23;i++){String key="W_hour"+(hour-i);keys.add(key);}//求倒退23小时的并集this.stringRedisTemplate.opsForZSet().unionAndStore("W_hour"+hour,keys,"W_day");//设置当前的key  40天过期for(int i=0;i<24;i++){String key="W_hour"+(hour-i);//过期时间设置为40天stringRedisTemplate.expire(key,40, TimeUnit.DAYS);}log.info("日榜合并完成");}/*** 周榜*/public void  refreshWeek(){long hour =System.currentTimeMillis()/(1000*60*60);List<String> keys=new ArrayList<>();for(int i=1;i<24*7-1;i++){String key="W_hour"+(hour-i);keys.add(key);}this.stringRedisTemplate.opsForZSet().unionAndStore("W_hour"+hour,keys,"W_week");log.info("周刷新完成");}/*** 月榜*/public void  refreshMonth(){long hour =System.currentTimeMillis()/(1000*60*60);List<String> keys=new ArrayList<>();for(int i=1;i<24*30-1;i++){String key="W_hour"+(hour-i);keys.add(key);}this.stringRedisTemplate.opsForZSet().unionAndStore("W_hour"+hour,keys,"W_month");log.info("月刷新完成");}
}

请添加图片描述
请添加图片描述
请添加图片描述

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

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

相关文章

《MySQL 实战教程:从零开始到高手进阶》

当然可以。下面是一篇关于MySQL的学习指南&#xff0c;它适合初学者到中级用户&#xff0c;涵盖了MySQL的基础知识、安装步骤、基本命令以及一些高级功能。 MySQL 学习指南 1. 了解 MySQL MySQL 是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典…

通过shell脚本分析部署nginx网络服务

通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 [rootlocalhost xzy]# vim 1.sh [rootlocalhost xzy]# chmod x 1.sh [rootlocalhost xzy]# ./1.sh2.判断服务是否安装 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&…

威胁驱动的网络安全方法论

摘要 目前的网络安全风险管理实践很大程度上是由合规性要求驱动的&#xff0c;这使得公司/组织不得不在安全控制和漏洞上投入人力/物力。&#xff08;风险管理涉及多个方面&#xff0c;包括资产、威胁、漏洞和控制&#xff0c;并根据事故发生的可能性及造成的影响进行评估。威…

『VUE』30. 生命周期的介绍(详细图文注释)

目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xf…

在 Unix 和类 Unix 操作系统中,信号是一种异步的通知机制,用于通知进程发生了一些特定的事件。

在 Unix 和类 Unix 操作系统中&#xff0c;信号是一种异步的通知机制&#xff0c;用于通知进程发生了一些特定的事件。以下是一些常见的信号及其用途和默认行为的详细介绍&#xff1a; 常见信号及其用途 SIGINT (2) 含义&#xff1a;中断信号&#xff08;Interrupt Signal&…

idea 通过git撤销commit但未push的操作

1、undo commit 适用情况&#xff1a;代码修改完了&#xff0c;已经Commit了&#xff0c;但是还未push&#xff0c;然后发现还有地方需要修改不想提交本次记录了。这时可以进行Undo Commit&#xff0c;修改后再重新Commit。注意&#xff1a;如果已经进行了Push&#xff0c;线上…

【graphics】图形绘制 C++

众所周知&#xff0c;周知所众&#xff0c;图形绘制对于竞赛学僧毫无用处&#xff0c;所以这个文章&#xff0c;专门对相关人员教学&#xff08;成长中的码农、高中僧、大学僧&#xff09;。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…

Spring Boot出现java: 错误: 无效的源发行版:16的解决方式

第一步&#xff1a; 修改为SDK的目标字节码版本 第二步&#xff1a;CtrlShiftAltS进入项目结构 第三步&#xff1a;pom.xml文件中 在网上搜索和自己SDK适配的Springboot版本&#xff0c;1.8对应的是2.7.1&#xff08;可以用&#xff09; 修改Java版本为1.8 最后的最后&a…

FPGA 第6讲 简单组合逻辑多路选择器

时间&#xff1a;2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数&#xff0c;与其他时刻的输入状态无关&#xff0c;无存储电路&#xff0c;也没…

【C++初阶】C++入门

1、C第一个程序 C是脱胎于C语言的&#xff0c;所以也包含了C语言绝大多数的内容&#xff0c;C兼容C语言绝大多数的语法,在C语言中能实现的程序在C中也是可以执行的&#xff0c;但需要将定义文件代码的后缀改为.cpp 就比如hello world程序 // test.cpp #include<stdio.h&g…

selenium元素定位校验以及遇到的元素操作问题记录

页面元素定位方法及校验 使用比较多的是通过id、class和xpath来对元素进行定位。在定位前可以现在浏览器验证是否可以找到指定的元素。这样就不用每添加一个元素定位都运行代码来检查定位方式表达式是否正确。 使用XPATH定位 在浏览器F12&#xff0c;找到元素&#xff0c;在元…

网络安全之国际主流网络安全架构模型

目前&#xff0c;国际主流的网络安全架构模型主要有&#xff1a; ● 信息技术咨询公司Gartner的ASA&#xff08;Adaptive Security Architecture自适应安全架构&#xff09; ● 美国政府资助的非营利研究机构MITRE的ATT&CK&#xff08;Adversarial Tactics Techniques &…

十一:HTTP 状态码详解:解读每一个响应背后的意义

HTTP(超文本传输协议)是网络通信的基石之一,主要用于客户端(例如浏览器)和服务器之间的通信。为了让服务器能准确地向客户端反馈请求的处理状态,HTTP设计了一套标准的状态码。每一个状态码代表了特定的含义,指示了请求的状态、潜在的问题或成功的信息。 1. 信息响应 (1…

【星海随笔】分布式管理Zookeeper

高可用集群 地址&#xff1a;https://archive.apache.org/dist/zookeeper TPS既每秒系统吞吐量 QPS即每秒查询率 Zookeeper的选举机制 确保所有节点对外表现为一个统一的服务。 选举机制分为两个阶段&#xff1a;Leader选举和投票确认 Zookeeper 的选举机制确保集群中的所有节…

CC工具箱使用指南:【CAD导出界址点Excel】

一、简介 群友定制工具。 面图层导出界址点Excel表之前已经做过好几个&#xff0c;这个工具则是将CAD导出Excel。 CAD数据如下&#xff1a; 工具将如上截图中的边界线导出界址点Excel&#xff0c;并记录下面内的文字。 二、工具参数介绍 点击【定制工具】组里的【CAD导出界…

windows wsl

设置默认版本 wsl --set-default-version 2 wsl --install wsl --list --online 1.修改Windows的网络配置&#xff0c;使用netsh命令添加端口转发规则 netsh interface portproxy add v4tov4 listenport2222 listenaddress0.0.0.0 connectport22 connectaddress172.25.2.…

如何在项目中用elementui实现分页器功能

1.在结构部分复制官网代码&#xff1a; <template> 标签: 这是 Vue 模板的根标签&#xff0c;包含所有的 HTML 元素和 Vue 组件。 <div> 标签: 这是一个普通的 HTML 元素&#xff0c;包裹了 el-pagination 组件。它没有特别的意义&#xff0c;只是为了确保 el-pagi…

Linux安装Nginx和Nginx基础配置

下载Nginx 方式一&#xff1a;通过官网下载后上传 通过官网下载安装包。下载地址https://nginx.org/en/download.html 这里选择稳定版的进行下载。 这里使用FinalShell终端工具操作&#xff0c;使用其他工具操作亦可。FinalShell工具下载地址&#xff1a;http://www.hostbuf…

Graph returned an error: An unknown error 的错误如何处理

文章来源&#xff1a;Graph returned an error: An unknown error 的错误如何处理 - 出海打渔 这个错误通常说5分钟内能重试成功就能成功&#xff0c; 一直失败的话&#xff0c;通常是投的application设置异常&#xff0c; 也有可能fb meta他们正在发版&#xff0c;marketing …

Ubuntu20.04从零安装IsaacSim/IsaacLab

Ubuntu20.04从零安装IsaacSim/IsaacLab 电脑硬件配置&#xff1a;安装Isaac sim方案一&#xff1a;pip安装方案二&#xff1a;预构建二进制文件安装1、安装ominiverse2、在ominiverse中安装isaac sim&#xff0c;下载最新的4.2版本 安装Isaac Lab1、IsaacLab环境克隆2、创建con…