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

数据库方式实现实时排行榜

文章目录

  • 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)
    • 🌟 亮点功能
    • 📦 spring cloud模块概览
      • 常用工具
    • 🔗 更多信息
    • 1.排行榜的设计
        • 1.实时榜单
          • 1.数据库统计
          • 2.redis 的 sorted set
        • 2.非实时榜单
    • 2.数据库方式实现
        • 1.sun-club-subject模块
          • 1.sun-club-application-controller
            • 1.SubjectController.java
            • 2.SubjectInfoDTO.java 新增三个属性
          • 2.sun-club-domain
            • 1.SubjectInfoDomainService.java
            • 2.SubjectInfoDomainServiceImpl.java
            • 3.SubjectInfoBO.java 新增三个属性
          • 3.sun-club-infra
            • 1.SubjectInfoService.java
            • 2.SubjectInfoServiceImpl.java
            • 3.SubjectInfoDao.java
            • 4.SubjectInfoDao.xml 注意count(1)要加别名才能与entity对应
            • 5.UserInfo.java 新增头像属性
            • 6.UserRpc.java 设置头像属性
        • 2.测试

🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)

Sun Frame Banner

轻松高效的现代化开发体验

Sun Frame 是我个人开源的一款基于 SpringBoot 的轻量级框架,专为中小型企业设计。它提供了一种快速、简单且易于扩展的开发方式。

我们的开发文档记录了整个项目从0到1的任何细节,实属不易,请给我们一个Star!🌟
您的支持是我们持续改进的动力。

🌟 亮点功能

  • 组件化开发:灵活选择,简化流程。
  • 高性能:通过异步日志和 Redis 缓存提升性能。
  • 易扩展:支持多种数据库和消息队列。

📦 spring cloud模块概览

  • Nacos 服务:高效的服务注册与发现。
  • Feign 远程调用:简化服务间通信。
  • 强大网关:路由与限流。

常用工具

  • 日志管理:异步处理与链路追踪。
  • Redis 集成:支持分布式锁与缓存。
  • Swagger 文档:便捷的 API 入口。
  • 测试支持:SpringBoot-Test 集成。
  • EasyCode:自定义EasyCode模板引擎,一键生成CRUD。

🔗 更多信息

  • 开源地址:Gitee Sun Frame
  • 详细文档:语雀文档
    在这里插入图片描述

1.排行榜的设计

1.实时榜单
1.数据库统计

现在数据库里面的 createby 字段。用户的标识是唯一的,那我们直接通过 group by 的形式统计 count。

select count(1),create_by from subject_info group by create_by limit 0,5;

数据量比较小,并发也比较小。这种方案是 ok 的。保证可以走到索引,返回速度快,不要产生慢 sql。

在数据库层面加一层缓存,接受一定的延时性。

2.redis 的 sorted set

有序集合,不允许重复的成员,然后每一个 key 都会包含一个 score 分数的概念。redis 根据分数可以帮助我们做从小到大,和从大到小的一个处理。

有序集合的 key 不可重复,score 重复。

它通过我们的一个哈希表来实现的,添加,删除,查找,复杂度 o(1) ,最大数量是 2 32 次方-1.

zadd

zrange

zincrby

zscore

这种的好处在于,完全不用和数据库做任何的交互,纯纯的通过缓存来做,速度非常快,要避免一些大 key 的问题。

2.非实时榜单

定时任务 xxl-job

统计数据库的数据形式,帮助我们统计完成后,直接写入缓存。缓存的外部的交互展示。

2.数据库方式实现

1.sun-club-subject模块
1.sun-club-application-controller
1.SubjectController.java
/*** 获取题目的贡献榜* @return*/
@PostMapping("/getContributeList")
public Result<List<SubjectInfoDTO>> getContributeList() {try {// 打印日志if (log.isInfoEnabled()) {log.info("SubjectController getContributeList");}// 获取贡献榜List<SubjectInfoBO> boList = subjectInfoDomainService.getContributeList();// 转换BO为DTOList<SubjectInfoDTO> dtoList = SubjectInfoDTOConverter.INSTANCE.convertBO2DTO(boList);return Result.ok(dtoList);} catch (Exception e) {log.error("SubjectController getContributeList error", e);return Result.fail("获取贡献榜失败");}
}
2.SubjectInfoDTO.java 新增三个属性
/*** 创建人昵称*/
private String createUser;/*** 创建人头像*/
private String createUserAvatar;/*** 题目数量*/
private Integer subjectCount;
2.sun-club-domain
1.SubjectInfoDomainService.java
/*** 获取贡献榜* @return*/
List<SubjectInfoBO> getContributeList();
2.SubjectInfoDomainServiceImpl.java
@Override
public List<SubjectInfoBO> getContributeList() {// 从数据库中查询题目信息的listList<SubjectInfo> subjectInfoList = subjectInfoService.getContributeList();// 如果查不到就直接返回空if (CollectionUtils.isEmpty(subjectInfoList)) {return Collections.emptyList();}// 如果查到了,就封装到BO中List<SubjectInfoBO> boList = new LinkedList<>();subjectInfoList.forEach(subjectInfo -> {SubjectInfoBO subjectInfoBO = new SubjectInfoBO();subjectInfoBO.setSubjectCount(subjectInfo.getSubjectCount());// rpc调用根据createBy来查询该用户的昵称和头像String createdBy = subjectInfo.getCreatedBy();UserInfo userInfo = userRpc.getUserInfo(createdBy);subjectInfoBO.setCreateUser(userInfo.getNickName());subjectInfoBO.setCreateUserAvatar(userInfo.getAvater());boList.add(subjectInfoBO);});return boList;
}
3.SubjectInfoBO.java 新增三个属性
/*** 创建人昵称*/
private String createUser;/*** 创建人头像*/
private String createUserAvatar;/*** 题目数量*/
private Integer subjectCount;
3.sun-club-infra
1.SubjectInfoService.java
/*** 获取贡献榜* @return*/
List<SubjectInfo> getContributeList();
2.SubjectInfoServiceImpl.java
    /*** 获取贡献榜* @return*/@Overridepublic List<SubjectInfo> getContributeList() {return this.subjectInfoDao.getContributeList();}
3.SubjectInfoDao.java
/*** 获取贡献榜* @return*/
List<SubjectInfo> getContributeList();
4.SubjectInfoDao.xml 注意count(1)要加别名才能与entity对应
<!-- 根据createdBy分组查询每组的题目数量 -->
<select id="getContributeList" resultMap="SubjectInfoMap">select count(1) as subjectCount,created_byfrom subject_infowhere is_deleted = 0and created_by is not nullgroup by created_bylimit 0, 5
</select>
5.UserInfo.java 新增头像属性
package com.sunxiansheng.subject.infra.eneity;import lombok.Data;/*** Description:* @Author sun* @Create 2024/6/16 13:47* @Version 1.0*/
@Data
public class UserInfo {private String userName;private String nickName;private String avater;
}
6.UserRpc.java 设置头像属性

image-20240621175440547

2.测试

image-20240621175609199

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • http参数污染利用php小特性绕过贷齐乐waf
  • Dom 元素转换 Image 图片 (截图)
  • 探索PHP的心脏:流行CMS系统全解析
  • KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持修改Hook,小程序
  • html复习
  • 大语言模型面试宝典:30+ 必考问题与答案,助你一臂之力
  • 关于100个linux常用的命令
  • 2-63 基于matlab的GMPHD滤波器算法
  • 互联网摸鱼日报(2024-08-13)
  • Java Nacos与Gateway的使用
  • 【一文搞懂】Rewind AI是什么?Rewind AI能干嘛?全网最全指南!
  • Web自动化测试:UI自动化框架结构以及思路!
  • 【机器学习之深度学习】深度学习和机器学习的关系以及深度学习的应用场景
  • PHP、JavaScript代码审计工具
  • 如何 让git commit 自动生成 submodules 改动的提交说明?
  • [LeetCode] Wiggle Sort
  • C语言笔记(第一章:C语言编程)
  • Django 博客开发教程 8 - 博客文章详情页
  • Java多线程(4):使用线程池执行定时任务
  • java中的hashCode
  • js递归,无限分级树形折叠菜单
  • laravel with 查询列表限制条数
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 浏览器缓存机制分析
  • 巧用 TypeScript (一)
  • 使用 Docker 部署 Spring Boot项目
  • 译自由幺半群
  • ## 基础知识
  • #vue3 实现前端下载excel文件模板功能
  • (+4)2.2UML建模图
  • (12)Linux 常见的三种进程状态
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (分布式缓存)Redis分片集群
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九)c52学习之旅-定时器
  • (每日一问)基础知识:堆与栈的区别
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net Winform开发笔记(一)
  • .net和jar包windows服务部署
  • .NET框架
  • [.net] 如何在mail的加入正文显示图片
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2010-8-30]
  • [AIGC codze] Kafka 的 rebalance 机制
  • [ASP]青辰网络考试管理系统NES X3.5
  • [BUG]vscode插件live server无法自动打开浏览器