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

news2024/11/15 4:57:10

文章目录

  • 🌞 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为DTO
        List<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() {
    // 从数据库中查询题目信息的list
    List<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
     */
    @Override
    public 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_by
    from subject_info
    where is_deleted = 0
      and created_by is not null
    group by created_by
    limit 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://www.coloradmin.cn/o/2033583.html

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

相关文章

25届秋招还有金九银十?会是“史上最难”?

吉祥学安全&#xff1a;知星&#x1f517;http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&chksmc0e47813f793f105017fb8551c9b996dc7782987e19efb166ab665f44ca6d900210e6c4c0281&scene21#wechat…

友元的一些资料

友元&#xff1a;可以访问私有权限下的一种代码 全局函数作友元&#xff1a; 我们创建了两个属性&#xff0c;并且通过无参构造函数给属性赋了值&#xff0c; 这个时候再创建一个goodgay类&#xff0c;形参是应用的buil1的对象&#xff0c;用这个引用的对象调用属性。所以下面…

笔记(day17)集合概述、List、Set、比较器

集合Collection 一.概述 ​ 集合可以理解为数据结构的封装,根据不同的特性及操作性能进行分类 二.继承体系 三.Collection中常用方法 ​ collection是集合中的父类,所以collection中的方法是所有集合中都有的 ​ 集合中只能保存引用类型(Object),无法保存基本类型 ​ Colle…

记一次CSDN认证模块后端未校验漏洞

前言 作为一个程序员&#xff0c;一直充满好奇心&#xff0c;没事就喜欢找找漏洞&#xff0c;试想一下某些程序是否存在某些鉴权等漏洞&#xff0c;目前该漏洞已提交官方&#xff0c;且影响不大&#xff0c;现分享分析过程用于各位技术学习。 漏洞分析 https://i.csdn.net/#…

【Hot100】LeetCode—3. 无重复字符的最长子串

目录 1- 思路滑动窗口 2- 实现⭐3. 无重复字符的最长子串——题解思路 3- ACM 实现 原题链接&#xff1a;3. 无重复字符的最长子串 1- 思路 滑动窗口 借助 HashSet 来实现判重通过指针 i 和 right 指针实现一个滑动窗口 2- 实现 ⭐3. 无重复字符的最长子串——题解思路 clas…

webrtc一对一视频通话功能实现

项目效果 实现原理 关于原理我就不做说明&#xff0c;直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器&#xff1a;Ubuntu24.04搭建turn服务器 mkcert的安装和使用&#xff1a;配置https访问 必须使用https协议&#xff0c; 由于浏览器的安全策略导致的&am…

图像处理中的图像梯度和幅值是什么???(通俗讲解)

在边缘检测和特征提取等任务中&#xff0c;图像的梯度和幅值是图像处理中非常重要的概念。 目录 一、图像的梯度1.1 专业解释1.2 通俗理解1.3 计算方式 二、梯度的幅值2.1 专业解释2.2 通俗理解2.3 计算方式 一、图像的梯度 1.1 专业解释 图像的梯度可以看作是图像中亮度或颜…

基于智能手机的3D模型快速生成技术

摘要&#xff1a; 本文介绍了一种创新技术&#xff0c;该技术允许用户通过智能手机拍摄视频&#xff0c;快速将2D图像转换为3D模型。这项技术为3D内容创作提供了一种高效且用户友好的解决方案。 关键词&#xff1a; 3D建模&#xff0c;智能手机&#xff0c;AI处理&#xff0c;…

【递归】1.汉诺塔问题

面试题 08.06. 汉诺塔问题 leetcode链接&#xff1a;https://leetcode.cn/problems/hanota-lcci/description/在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。 一开始&#xff0c;所有盘子自上而下按升序依次套在第…

WMS如何实现与TMS的双向信息流?

要实现仓储管理系统&#xff08;WMS&#xff09;与运输管理系统&#xff08;TMS&#xff09;之间的双向信息流&#xff0c;可以通过以下几个步骤进行集成&#xff1a; —————————————————— 1、需求分析&#xff1a; 1):确定WMS和TMS之间需要传输的数据类型&…

“小巨人”『南斗六星』×企企通,携手推动华中地区智能网联企业供应链数字化发展

近日&#xff0c;湖北省知名“小巨人”企业——南斗六星系统集成有限公司&#xff08;以下简称“南斗六星”&#xff09;与企企通达成合作&#xff0c;并成功召开数字化建设项目启动会议。 由南斗六星总经理带头的各部门骨干&#xff0c;以及企企通华中区负责人、项目负责人等一…

小白零基础学数学建模应用系列(二):基于Python的共享单车系统建模与仿真分析

共享单车系统作为一种绿色环保的出行方式&#xff0c;已成为现代城市公共交通的重要组成部分。本文将使用Python编程语言&#xff0c;并结合modsim库&#xff0c;构建并仿真一个共享单车系统的模型&#xff0c;通过这一过程来展示如何进行系统的建模与分析。 文章目录 一、背景…

大厂面试题分享第二期

大厂面试题分享第二期 如果执行了一条命令&#xff0c;"select count(*)from…"&#xff0c;使用哪个引擎更快&#xff0c;为什么&#xff1f;垃圾回收器 CMS 和 G1的区别介绍一下CMS和G1CMS&#xff08;并发&#xff09;垃圾收集器G1垃圾回收器 HTTPS和HTTP的区别主…

网站谷歌SEO优化要注意什么?

就最近我们接触的客户而言&#xff0c;有不少客户连最基本的seo常识都没有&#xff0c;他们固然可能是技术大咖&#xff0c;但如果你还是期望从谷歌seo获取流量&#xff0c;那么&#xff0c;最基本的源代码输出必须要有&#xff0c;正常情况下&#xff0c;整个页面除了动画交互…

windows10和linux(debian12)设置静态ip————附带详细过程

文章目录 0 背景1 linux&#xff08;debian&#xff09;1.1 查看网络配置1.2 获取ip动态分配下的配置1.3 打开网络配置文件1.4 重新启动网络服务1.5 验证设置 2 windows2.1 查看自动获取ip地址下的配置2.2 进行设置 0 背景 因为下位机只能获取固定的ip&#xff08;ip池很小&am…

递归 与 dfs 综合练习(一)

目录 一、找出所有子集的异或总和再求和 1.题目链接&#xff1a;1863. 找出所有子集的异或总和再求和 2.题目描述&#xff1a; 3.解法&#xff08;递归&#xff09; &#x1f335;算法思路&#xff1a; &#x1f335;算法代码&#xff1a; 二、全排列 II 1.题目链接&…

“低代码技术:数字化工厂的加速器与智能制造的桥梁“

引言 随着工业4.0和智能制造的快速发展&#xff0c;数字化工厂成为了现代制造业的核心概念。这一转型不仅依赖于物联网、人工智能、大数据等新兴技术&#xff0c;也需要软件开发的支持。然而&#xff0c;传统的软件开发模式由于其复杂性和周期长&#xff0c;难以快速适应数字化…

案例-华东某财险公司:引入监控易一体化运维软件

在华东这片经济活跃、金融繁荣的热土上&#xff0c;某财险公司作为行业内的佼佼者&#xff0c;始终致力于通过科技创新提升业务运营效率与服务品质。随着公司业务规模的不断扩大&#xff0c;IT基础设施的复杂性和重要性日益凸显&#xff0c;如何实现对庞大IT基础资源的实时监控…

从概念到现实:手机设计可视化如何重塑科技美学

在这个日新月异的数字时代&#xff0c;手机已不仅仅是通讯工具&#xff0c;它更是我们生活方式的延伸&#xff0c;是连接世界的窗口&#xff0c;是创意与科技的完美结晶。 想象一下&#xff0c;在浩瀚的数字海洋中&#xff0c;一款尚未面世的手机&#xff0c;通过高精度的3D建模…

在亚马逊云科技上安全、合规、私密地调用生成式AI大模型

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何安全、合规、私密地调用亚…