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

历史榜单的存储策略

由于我们要解决的是数据过多问题,因此分表的方式选择水平分表。具体来说,就是按照赛季拆分,每一个赛季是一个独立的表,如图:

不过这里我们可以做一些简化:

  • 我们可以将id作为排名,排名字段就不需要了。

  • 不同赛季用不同表,那么赛季字段就不需要了。

综上,最终表结构可以是这样:

不过这就存在一个问题,每个赛季要有不同的表,这些表什么时候创建呢?

显然,应该在每个赛季刚开始的时候(月初)来创建新的赛季榜单表。每个月的月初执行一个创建表的任务,我们可以利用定时任务来实现。

由于表的名称中包含赛季id,因此在定时任务中我们还要先查询赛季信息,获取赛季id,拼接得到表名,最后创建表。

大概流程如图:

 CREATE TABLE IF NOT EXISTS `points_board_X`(`id`      BIGINT NOT NULL AUTO_INCREMENT COMMENT '榜单id',`user_id` BIGINT NOT NULL COMMENT '学生id',`points`  INT    NOT NULL COMMENT '积分值',PRIMARY KEY (`id`) USING BTREE,INDEX `idx_user_id` (`user_id`) USING BTREE)COMMENT ='学霸天梯榜'COLLATE = 'utf8mb4_0900_ai_ci'ENGINE = InnoDBROW_FORMAT = DYNAMIC;

表名称的前缀是points_board_,我们应该将其定义为常量。在tj-learning模块中定义: 

 

表中的字段少了2个(rank、season),因此我们需要修改对应的实体类: 

2.3.定时任务生成榜单表

接下来,我们通过SpringTask定义一个定时任务,在每月初动态生成赛季榜单表。

2.3.1.定时任务

首先,在tj-learning模块下定义一个任务处理类:

 

package com.tianji.learning.handler;import com.tianji.common.utils.CollUtils;
import com.tianji.common.utils.DateUtils;
import com.tianji.learning.service.IPointsBoardSeasonService;
import com.tianji.learning.service.IPointsBoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.util.List;import static com.tianji.learning.constants.LearningConstants.POINTS_BOARD_TABLE_PREFIX;@Component
@RequiredArgsConstructor
public class PointsBoardPersistentHandler {private final IPointsBoardSeasonService seasonService;private final IPointsBoardService pointsBoardService;@Scheduled(cron = "0 0 3 1 * ?") // 每月1号,凌晨3点执行public void createPointsBoardTableOfLastSeason(){// 1.获取上月时间LocalDateTime time = LocalDateTime.now().minusMonths(1);// 2.查询赛季idInteger season = seasonService.querySeasonByTime(time);if (season == null) {// 赛季不存在return;}// 3.创建表pointsBoardService.createPointsBoardTableBySeason(season);}
}

 

 

 

http://www.xdnf.cn/news/986.html

相关文章:

  • 【系统架构设计师】信息安全的概念
  • Linux之信号
  • 【DataScript】标准数据格式化-国民经济行业分类(GB/T 4754-2017)
  • NLP高频面试题(四十八)大语言模型中的思维链(CoT)技术详解
  • Kafka 详细解读
  • 合同管理Contract Management
  • PowerBI工具提示-将表悬浮在数据上方
  • 【英语语法】词法---数词
  • 服务器数据迁移指南
  • docker基本命令1
  • 21-算法打卡-哈希表-三数之和-leetcode(15)-第二十一天
  • 鸿蒙系统ArkTs代码复习1
  • 多线程使用——线程池
  • 基于opencv和PaddleOCR识别身份证信息
  • RIP动态路由,实现两台PC互通三个路由器,两台电脑
  • 成功案例|TRAP1 与 CAMSAP3:早期子宫内膜癌预后的新 “风向标”
  • Federated Feature Augmentation and Alignment
  • Linux卸载删除gitlab
  • Vmware esxi 给现有磁盘增加空间后并扩展系统里磁盘空间
  • 文件内容课堂总结
  • Webpack 插件开发
  • MYDB仿MySQL手写数据库项目总结
  • UML 状态图:解锁电子图书馆管理系统的高效设计
  • 经典文献阅读之--KISS-Matcher(快速且稳健的点云注册)
  • C语言中联合体(Union)和结构体(Struct)的嵌套用法
  • VS Code + GitHub:高效开发工作流指南
  • 前端vue监听 -watch
  • 基于Redis实现高并发抢券系统的数据同步方案详解
  • Redis 有序集合(Sorted Set)
  • Spark,序列化反序列化