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

news2024/10/6 18:25:36

产品需求:

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

设计方案:

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

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

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

 结果:

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

重新设计方案:

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

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

1. 先看mybatis如何创建表

    <select id="existTable" parameterType="String" resultType="Integer">
        select count(*)
        from information_schema.TABLES
        where 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.coloradmin.cn/o/555306.html

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

相关文章

第03章 流程控制语句

流程控制语句是用来控制程序中各语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑模块。 程序设计中规定的三种流程结构&#xff0c;即&#xff1a; 顺序结构 程序从上到下逐行地执行&#xff0c;中间没有任何判断和跳转。 分支结构 根据条件&#xff0…

软件测试理论----测试设计方法论

1、测试用例格式 &#xff08;1&#xff09;用例编号&#xff1a;用例的唯一标识&#xff0c;要求具有易识别性和易维护性&#xff0c;能能够根据用例编号识别用例的目的和作用&#xff0c;一般格式为&#xff1a;A-B-C-D 其中 A&#xff1a;一般表示产品或者项目名称B&#…

Linux的启动流程

文章目录 Linux的启动流程BIOS、boot loader与kernel加载BIOSboot loader加载内核检测硬件与 initramfs 的功能 Linux的启动流程 本文章参考&#xff1a; [Uncertainty!!]的Linux的启动流程 Linux的启动流程是一个非常复杂的过程&#xff0c;下面是对Linux启动流程的详细分析&a…

JDBC-Java与数据库之间的桥梁

1、JDBC 1.1、数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c; 数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通过各种关系数…

IO流详解

IO流 1. 文件 1.1 什么是文件 文件对大家来说都不陌生&#xff1a; 文件是保存数据的地方&#xff0c;它可以保存文字、图片、视频等等例如大家平时使用的word文档、Excel文档、PPT文档等都是文件 1.2 文件流 文件在程序中是以流的形式来操作的流是指数据在数据源&#x…

mydumper - 备份恢复工具

文章目录 介绍部署安装功能 参数详解mydumpermyloader配置文件 实际示例操作性能验证 补充definerlock 总结相关链接 介绍 部署安装 # 当前最新 release wget https://github.com/mydumper/mydumper/releases/download/v0.14.4-8/mydumper-0.14.4-8.el7.x86_64.rpm# 安装 rpm…

Linux 之 firewalld 防火墙

目录 firewalld概述firewalld 与 iptables 的区别&#xff1a;firewalld 区域的概念firewalld防火墙预定义了9个区域:firewalld 数据处理的流程 firewalld防火墙的配置方法&#xff1a;永久保存配置 firewalld概述 firewalld防火墙是Centos7系统默认的防火墙管理工具&#xff…

数据分析与预处理常用的图和代码

1.训练集和测试集统计数据描述之间的差异作图&#xff1a; def diff_color(x):color red if x<0 else (green if x > 0 else black)return fcolor: {color}(train.describe() - test.describe())[features].T.iloc[:,1:].style\.bar(subset[mean, std], alignmid, colo…

国内做校园信息化的龙头企业公司有哪些?

随着数字化转型的加速&#xff0c;越来越多的学校开始寻求校园信息化的解决方案&#xff0c;相比于传统信息化模式&#xff0c;国内有哪些做校园信息化做得比较好的企业&#xff1f;他们采用的又是什么样的方式&#xff1f; 一文带你了解&#xff0c;零代码平台搭建校园信息化…

Android 14 又来了?别扶!抬起我来吧!

Android 14 又来了&#xff1f;别扶&#xff01;抬起我来吧&#xff01; 大家好&#xff0c;好久不见&#xff0c;从去年底写完年终总结之后就再也没有更新过文章&#xff0c;之前最多也就间隔一两个月时间&#xff0c;但这回间隔时间确实有点长&#xff0c;基本快半年了&…

每日一练 | 网络工程师软考真题 Day7

1、如果希望别的计算机不能通过ping命令测试效劳器的连通情况&#xff0c;可以 &#xff08;1&#xff09; 。如果希望通过默认的Telnet端口连接效劳器&#xff0c;那么下面对防火墙配置正确的选项是 &#xff08;2&#xff09; 。 &#xff08;1&#xff09; A&#xff0…

为什么说2023年是学华为认证的最佳时机?学华为认证有什么优势?

华为认证数通方向2016年以前叫数通&#xff0c;2017年开始改为R&S&#xff08;路由交换&#xff09;&#xff0c;2021年正式升级为Datacom。 新版数通认证更聚焦于技术在现实工作场景中的应用&#xff0c;并融入了大量新技术新应用&#xff0c;实用价值更高。 通过系统学…

用java带你了解IO模型

目录 1.BIO1.1 简述1.2 代码示例1.3优点和缺点1.4 思考 2. NoBlockingIO2.1 简述2.2 代码示例2.3 优点和缺点2.4 思考 3. NIO&#xff08;NewIO&#xff09;3.1 简述3.2 代码示例3.3 优点和缺点3.3 思考 4. 扩展select/poll、epoll4.1 简述4.2 select/poll4.3 epoll4.4 扩展话题…

设计模式之【备忘录模式】,“后悔药”是可以有的

文章目录 一、什么是备忘录模式1、备忘录模式使用场景2、备忘录模式优缺点3、备忘录模式的三大角色4、白箱备忘录和黑箱备忘录5、思考&#xff1a;备份频率快&#xff0c;备份对象大的备忘录应该如何设计 二、实例1、备忘录模式的一般写法2、使用栈管理富文本编辑器3、游戏状态…

【Linux】shell编程—sed编辑器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、sed编辑器1.sed工作流程2.sed工作场景3.sed常用选项 二、sed编辑器基本用法1.打印操作2.打印行号3.增加操作4.插入操作5.替换操作7.字符转换 一、sed编辑器 sed…

RabbitMQ(2)

一、MQ的问题 基于上篇存在的问题 1. 问题说明 MQ在分布式项目中是非常重要的&#xff0c; 它可以实现异步、削峰、解耦&#xff0c;但是在项目中引入MQ也会带来一系列的问题。 今天我们要解决以下几个常见的问题&#xff1a; 消息可靠性问题&#xff1a;如何确保消息被成功送…

编译flink1.6源码并打包成CDH6.3.2的parcel

说明&#xff1a;scala &#xff1a;2.12&#xff0c;maven:3.6.1, java:1.8&#xff0c;macOS 1、指定scala,maven的环境变量 sudo vi ~/.bash_profile export PATH$PATH:$M2_HOME/bin:/Users/admin/Documents/softwares/scala-2.12.17/bin2、克隆flink代码 git clone https…

smb配置,详细图文及配置

samba :网络文件共享服务 ​ Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件&#xff0c;而SMB是Server Message Block的缩写&#xff0c;即为服务器消息块&#xff0c;SMB主要是作为Microsoft的网络通讯协议&#xff0c;后来Samba将SMB通信协议应用到了Linux系统上…

【Android入门到项目实战-- 11.4】—— ExoPlayer视频播放器框架的详细使用

目录 什么是ExoPlayer 一、基本使用 1、添加依赖项 2、布局 3、Activity 二、自定义播放暂停 1、首先如何隐藏默认的开始暂停和快进&#xff1f; 2、自定义 三、控制视频画面旋转和比例调整 四、全屏放大和缩小 1、双击视频放大缩小 2、按钮放大缩小 五、完整的实现…

JS 面试整理

1.JS运行机制&#xff08;EventLoop事件循环&#xff09; Js是单线程&#xff0c;每次只能执行一项任务&#xff0c;其他任务按照顺序排队等待&#xff0c;使用eventloop来解决线程阻塞的问题。在执行栈过程中&#xff0c;有同步代码和异步代码时&#xff0c;首先会执行完所有…