软件代码设计-小优化(五)

news/2025/2/12 19:04:24/

产品需求:

        按照天统计策略信收信人数和收信次数。以前策略信只有发送是没有收集的,现在要数据咋办,得收集啊。

设计方案:

        因为策略信的发送是在一个单独的工程里,没有连接数据库。于是收集策略信放到了redis的list里,其中redis的key按照当天日期标识,因为还要统计收策略信的次数,所以允许重复,选择了redis的list。

        然后在管理后台的工程里,通过定时任务取redis的数据,存到表里。

        数据统计,直接查询表数据。

 结果:

        数据是正确的,没问题。但是跑了一段时间后,发现这个表的数据太大了。。。。。。

重新设计方案:

        删除历史数据,仅保留最近3个月的。但是这个表定时插入、定时查询、定时删除,可能会把数据库搞垮了。

        那就搞个新的表, 执行定时插入和定时查询,老的表执行定时删除。问题来了:搞一个新的表,跑一段时间,不还是会数据太大吗?弄一个分表,10天1张表。

1. 先看mybatis如何创建表

    <select id="existTable" parameterType="String" resultType="Integer">select count(*)from information_schema.TABLESwhere table_name = #{tableName}</select><!-- 删除指定的表--><update id="dropTable">DROP TABLE IF EXISTS ${tableName}</update><!-- 创建新的日志表--><update id="createTable" parameterType="String">CREATE TABLE ${tableName}(`id` bigint(20) NOT NULL AUTO_INCREMENT,`day` varchar(45) DEFAULT NULL COMMENT '日期',`userid` bigint(20) DEFAULT NULL COMMENT '用户id',`country` varchar(45) DEFAULT NULL COMMENT '国家',`channel` varchar(45) DEFAULT NULL COMMENT '渠道',`af_channel` varchar(64) DEFAULT NULL COMMENT '归因渠道',`user_regist_time` datetime DEFAULT NULL COMMENT '用户注册时间',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;</update>

2. 如何做到10天分表

String tableCacheKey = "day:strategy:buried:tablename";String tableName = "day_strategy_buried_";DateTime todayDateTime = DateTime.now();String tableDateNumber = todayDateTime.toString("yyyyMMdd");if(!redisUtil.hasKey(tableCacheKey)) { //redis里没有,就用当天日期tableName += tableDateNumber;redisUtil.set(tableCacheKey,todayDateTime.toString("yyyy-MM-dd"),30, TimeUnit.DAYS);} else {Object tableDateFromRedis = redisUtil.get(tableCacheKey);DateTime redisDateTime = DateTime.parse(tableDateFromRedis.toString());int daysBetween = Days.daysBetween(redisDateTime,todayDateTime).getDays();if (daysBetween % 10 != 0) {//不够10天就用上一次存的日期,tableDateNumber = redisDateTime.toString("yyyyMMdd");} else {//够10天就用新的日期redisUtil.set(tableCacheKey,todayDateTime.toString("yyyy-MM-dd"),30, TimeUnit.DAYS);}tableName += tableDateNumber;}log.info("tableName................{}",tableName);//判断表是否存在int exist = strategyBuriedMapper.existTable(tableName);if (exist > 0) return tableName;//不存在,则创建strategyBuriedMapper.createTable(tableName);

运行几天,看看啥效果。

有好的方案,欢迎赐教。


http://www.ppmy.cn/news/74038.html

相关文章

Ansys Lumerical | 对铁电波导调制器进行仿真应用

说明 在本例中&#xff0c;我们仿真了使用BaTiO2的铁电波导调制器&#xff0c;BaTiO2是一种折射率因外加电场而发生变化的材料。该器件的结构基于文献[1]。我们模拟并分析了给定工作频率下波导调制器的有效折射率与电压的关系。 背景 铁电波导由硅层和玻璃衬底上的BiTiO3&#…

Vault介绍

一. 关于Vault Vault 是一个广泛使用的开源工具,用于安全地存储和管理机密信息,如密码、证书、API 密钥和访问令牌等,从而提高安全性。 以下是 Vault 的一些主要功能和用途: 安全存储机密信息:Vault 提供了一个中央存储库,可以将密码、证书、API 密钥、访问令牌等机密信…

MyBatis Plus 插件 动态数据源实现原理与源码讲解 (dynamic-datasource-spring-boot-starter-master)

目录 1. 介绍 2. 基本原理 3. 源码介绍 3.1 使用 AOP 拦截&#xff0c;方法执行前获取到当前方法要用的数据源 3.2 实现自定义 DataSource 接口&#xff0c;实现 DataSource 接口的 getConnect 方法做动态处理 1. 介绍 多数据源即一个项目中同时存在多个不同的数据库连接…

springboot+jsp+java流浪动物猫狗领养救助网站367hp

本流浪猫狗领养救助网站共包含14个表:分别是宠物类型信息表&#xff0c;配置文件信息表&#xff0c;流浪宠物评论表信息表&#xff0c;活动类型信息表&#xff0c;领养宠物信息表&#xff0c;领养中心信息表&#xff0c;流浪宠物信息表&#xff0c;宠物知识信息表&#xff0c;收…

MATLAB | 实用(离谱)小技巧大合集:仅隐藏轴线 | 复杂公式刻度标签 | 渐变背景 | 半透明图例... ...

看到阿昆的科研日常写了一篇如何将轴线隐藏而不隐藏刻度的推送&#xff0c;使用了XRuler中的Axle对象来实现&#xff0c;但我试了一下R2023A版本中不太能直接用&#xff0c;解决了一下&#xff0c;同时讲一下这些有趣的隐藏对象及其其他的用法。 1 隐藏轴框线 假设我们编写了如…

AI绘画新秀-免费使用-Leonardo(Midjourney对手)注册教程

本教程收集于:AIGC从入门到精通教程 AI绘画新秀-免费使用-Leonardo(Midjourney对手) 保姆级注册教程 目录 一、写在前面的话。 二、纯文字教程 2.1 Leonardo注册教程:

手机里的视频删了怎么恢复

手机里的视频删了怎么恢复?手机已经成为一个人生活中不可或缺的工具&#xff0c;尤其是在记录生活中美好瞬间上&#xff0c;很多人都会使用手机去拍下那丰富多彩的视频。然而&#xff0c;有视频就会有清理&#xff0c;不可能所有的视频都合适&#xff0c;但如果不小心将一些重…

网络模块封装

网络模块封装 library-network模块配置依赖一.自定义LiveDataCallAdapterFactory1.定义ApiResponse返回的数据类型2.LiveDataCallAdapter.kt3.LiveDataCallAdapter.kt 二.自定义CustomGsonConverterFactory三.拦截器1.HeaderInterceptor请求头拦截器2.BasicParamsInterceptor参…