Spring 分批处理 + 冷热数据分离:历史订单高效迁移与数据清理实战

在实际业务中,随着时间推移,订单量持续增长,若未及时进行数据治理,会造成数据库膨胀、查询缓慢、性能下降等问题。为了实现数据分层管理和系统高性能运行,我们在项目中采用了“冷热数据分离 + 分批迁移 + 数据清理”的综合方案。

本文将围绕以下几个核心点展开:

  • ✅ 为什么要进行冷热数据分离?

  • ✅ 如何用分批分页迁移历史订单?

  • ✅ 如何在迁移完成后安全删除同步表数据?


🔍 一、为什么要冷热数据分离?

随着订单业务增长,即使采用分库分表,数据总量依旧快速膨胀。对历史订单的访问热度远远低于进行中订单。因此我们有必要:

  • 热数据(15日内未完成订单)保存在主订单表,供高频访问;

  • 冷数据(15日前完成订单)归档到历史订单表,减少主库压力;

  • 提升整体系统性能和数据库查询效率。

❗注意:虽然阿里云 OSS 等对象存储价格低,但不支持复杂查询操作(如 SQL 聚合、分页、统计),无法满足用户和运营的历史订单检索与分析需求,因此必须选择支持查询的数据库,如分布式数据库 TiDB。


🔄 二、分批分页迁移:保证性能和稳定性

✨ 核心思想:

  • 一次迁移 1000 条数据,控制内存和 SQL 压力;

  • 使用 offset + limit 实现分页;

  • 按天定时迁移前一天完成的订单;

  • 保证数据完整性,支持失败重试。

🔧 迁移代码示例:

@Override
public void migrate() {log.debug("历史订单迁移开始...");int offset = 0, perNum = 1000;LocalDateTime startTime = DateUtils.getDayStartTime(DateUtils.now().minusDays(1));LocalDateTime endTime = DateUtils.getDayEndTime(DateUtils.now().minusDays(1));Integer total = historyOrdersSyncService.countBySortTime(startTime, endTime);if (total <= 0) return;while (offset < total) {baseMapper.migrate(startTime, endTime, offset, perNum);offset += perNum;}log.debug("历史订单迁移结束。");
}

🧹 三、迁移完成后,如何安全删除同步表数据?

在实现冷热分离过程中,我们使用中间同步表(用于异步迁移),为避免数据重复、节省空间,迁移完成后需及时删除同步表中已处理的数据。

为了防止误删或未迁移完全,我们加入了删除前校验机制

🛡 删除逻辑及校验示例:

@Override
public void deleteMigrated() {LocalDateTime startTime = DateUtils.getDayStartTime(DateUtils.now().minusDays(1));LocalDateTime endTime = DateUtils.getDayEndTime(DateUtils.now().minusDays(1));// 1. 检查是否存在可删除数据Integer totalOfDelete = historyOrdersServeSyncService.countBySortTime(startTime, endTime);if (totalOfDelete <= 0) {log.debug("无迁移服务单数据需要删除");return;}// 2. 校验迁移是否完整Integer totalMigrated = lambdaQuery().between(HistoryOrdersServe::getSortTime, startTime, endTime).count();if (NumberUtils.null2Zero(totalMigrated) <= 0 || totalOfDelete > totalMigrated) {log.error("服务单未完全迁移,同步数据删除失败");return;}// 3. 删除同步表中已迁移数据historyOrdersServeSyncService.deleteBySortTime(startTime, endTime);
}

⚠️ 删除保障机制:

校验项描述
数量比对同步表中“待删除数量”必须 ≤ 历史表中“已迁移数量”
分时间段删除与迁移都按天执行,避免大批量误删
日志记录失败及时报警,便于排查

🧠 四、架构补充说明

🔗 为什么不直接删除主表而使用同步表?

  • 避免直接影响主库性能;

  • 支持异步、可重试的迁移策略;

  • 可配合 binlog + MQ 实现实时同步机制。

💽 使用 TiDB 存储历史数据的优势:

  • 支持 MySQL 协议,易于对接;

  • 同时支持 OLTP 和 OLAP 查询(HTAP);

  • 分布式架构,水平扩展,适合大规模数据归档。


✅ 总结

历史订单迁移不仅是技术优化,更是数据治理的关键环节。

本方案通过以下几个方面保证效率与稳定:

  • 使用分页迁移,避免性能瓶颈;

  • 同步表中间态设计,解耦迁移流程;

  • 增加数据完整性校验与清理逻辑;

  • 结合 定时任务 实现每日自动迁移与清理;

  • 历史数据存储选择 支持 SQL 的分布式数据库(如 TiDB),满足查询与统计需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78189.shtml

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

相关文章

新手SEO优化核心步骤

内容概要 对于SEO新手而言&#xff0c;建立系统化的优化框架是突破入门瓶颈的关键。SEO的核心在于通过技术手段与内容策略的结合&#xff0c;提升网站在搜索引擎中的可见性与用户价值。具体而言&#xff0c;新手需优先掌握关键词研究&#xff0c;明确目标用户的搜索意图&#…

C++ 之 【list的简介、list 的构造函数、iterator、容量操作、元素访问、增删查改与迭代器失效】

目录 1.list的介绍 2.list的使用 2.1 构造函数 2.2 iterator 的使用 2.3 容量操作 2.4 元素访问 2.5 增删查改 2.5.1头插头删与尾插尾删 2.5.2 insert 、erase 函数 2.5.3 clear、swap函数 2.5.4 关于find函数 3.迭代器失效 1.list的介绍 (1)list的底层通常实现为带…

Laravel Octane 项目加速与静态资源优化指南

Laravel Octane 项目加速与静态资源优化指南 一、Octane 核心加速配置 扩展安装与环境配置 composer require laravel/octane # 安装核心扩展‌php artisan octane:install # 生成配置文件&#xff08;选择 Swoole/RoadRunner 等服务器&#xff09;‌服务器参数调优‌ …

高露洁牙膏是哪个国家的品牌?高露洁牙膏哪一款最好?

高露洁是来自于美国一个比较有知名度的品牌&#xff0c;在1806年的时候创立。总部是在美国纽约公园大道&#xff0c;在1873年时&#xff0c;高露洁就已经开始销售罐装牙膏。 在1896年时期推出可折叠管牙膏&#xff0c;在口腔护理产品发展的过程中拥有着不容忽视的地位。在1992…

【Python爬虫详解】第八篇:突破反爬体系的工程实践

当矛与盾的较量进入白热化&#xff0c;突破反爬需要的不只是技巧&#xff0c;更是一套完整的工程化解决方案——本文将揭示对抗现代反爬体系的九大核心战术。 一、JavaScript混淆的深度破解 1. AST&#xff08;抽象语法树&#xff09;解混淆 案例&#xff1a;某电商平台商品价…

【Linux调整FTP端口】

Linux调整FTP端口 一、确保新端口未被占用在修改端口之前&#xff0c;可以使用以下命令检查端口是否被占用&#xff1a; 二、修改vsftpd配置文件1. 打开vsftpd配置文件2. 找到并修改端口配置3. 保存并退出4. 重启vsftpd服务 三、配置防火墙 在Linux系统中修改FTP端口&#xff0…

npm打包内存不足- JavaScript heap out of memory

直接贴出报错信息 <--- Last few GCs --->[30904:0000010F60FE58E0] 22090 ms: Scavenge 2037.4 (2069.4) -> 2036.4 (2074.2) MB, 2.5 / 0.0 ms (average mu 0.228, current mu 0.216) allocation failure [30904:0000010F60FE58E0] 22101 ms: Scavenge 2…

AI大语言模型破译“未知未知”的密钥:开源情报、被动收入与智能体协作的深层机理与实践

在人类认识世界的漫长征程中&#xff0c;信息与知识的获取和运用一直是核心驱动力。我们从“一无所知”的状态&#xff0c;逐渐积累“已知已知”&#xff0c;并在此基础上识别“已知未知”&#xff0c;设定目标去探索解答。然而&#xff0c;真正能够带来范式转变、颠覆现有格局…

kubelet 清理资源以缓解磁盘压力

kubelet 资源清理缓解磁盘压力指南 在 Kubernetes 集群中&#xff0c;当节点磁盘压力过大时&#xff0c;可通过以下几种方式利用 kubelet 清理资源&#xff0c;从而缓解磁盘压力。 一、镜像垃圾回收 自动回收 kubelet 内置了镜像垃圾回收机制&#xff0c;其行为由配置参数控…

SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+欧拉回路】

自我吐槽 &#xff08;哭 题目传送门 SPOJ 洛谷 题目大意 让你在简单无向图上删去2条边&#xff0c;使该图联通并存在欧拉回路 输出字典序最小的一对边 思路 考虑到存在欧拉回路的充要条件&#xff0c;即 i n x ≡ 0 ( m o d 2 ) ∀ i ( 1 ≤ i ≤ n ) in_x\equiv 0 (\m…

藏文情感分析器入门学习实践

&#x1f3af; 项目目标&#xff1a; 输入一段藏文短句。自动分析这句话的情感倾向&#xff1a;积极&#xff08;正面&#xff09;/消极&#xff08;负面&#xff09;/中立。 &#x1f50d; 技术原理简介 情感分析是什么&#xff1f; 情感分析&#xff08;Sentiment Analysi…

双指针(5)——有效三角形个数

题目&#xff1a; 这道题我们首先可能会想到暴力解法&#xff0c;三个for循环然后进行check&#xff08;&#xff09;。时间复杂度肯定是不允许的。 同时&#xff0c;验证可以组成三角形的条件是任意两边之和大于第三边&#xff0c;这就意味着我们每组要进行三次比较。但也有捷…

书生实战营之沐曦专场

一&#xff1a;实验环境进入和启动实验容器(D.run平台) 1.1首先进入平台进行注册 D.run平台https://console.d.run/ 注册和登录环节就跳过了。 1.2 启动实验容器--详细步骤如下 1.2.1选择容器的名称、区域、镜像&#xff08;注意镜像必须选择Dlinfer&#xff09; 1.2.2可以选…

内置类型成员变量的初始化详解

在 C 中&#xff0c;内置类型&#xff08;如 int、float、double、char、指针等&#xff09;的初始化方式与类类型&#xff08;如 std::string、自定义类&#xff09;不同。由于内置类型没有构造函数&#xff0c;它们的初始化行为由编译器直接处理。以下是详细解析&#xff1a;…

对第三方软件开展安全测评,如何保障其安全使用?

对第三方软件开展安全测评&#xff0c;能够精准找出软件存在的各类安全隐患&#xff0c;进而为软件的安全使用给予保障。此次会从漏洞发现、风险评估、测试环境等多个方面进行具体说明。 漏洞发现情况 在测评过程中&#xff0c;我们借助专业技术与工具&#xff0c;对第三方软…

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文档 1. 项目结构 假设项目名为 springboot-openapi-demo&#xff0c;以下是项目的基本结构&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…

python入门(1)变量与输入输出

一、变量 使用规则 变量名值例子 a13变量名规则 变量名可以用大小写字母、数字、下划线。 数字、下划线不可开头 例子 name name1 1name name_first _first 二、输入输出 输出print print(*objects,sep"",end"\n") objects:多个要输出的值 sep:每个…

TS 安装

TS较JS优势 1 TS静态类型编程语言。编译时发现错误 2 类型系统 强化变量类型概念 3 支持新语法 4 类型推断机制 可以和React框架中的各种hook配合 5 任何地方都有代码提示 tsc 命令 将TS转为JS 1 tsc 文件.ts 生成 js文件 2 执行JS代码

Linux-常用监控工具

以下是对 Linux 系统中常用监控工具&#xff08;netstat、ss、dmesg&#xff09;的系统性介绍&#xff0c;涵盖其核心功能、典型用法及实际应用场景&#xff0c;帮助您分析系统状态和内核参数调整后的效果&#xff1a; 1. netstat -s&#xff1a;网络协议栈统计监控 功能 net…

Linux系统:详解文件描述符与重定向原理以及相关接口(open,read,write,dup2)

本节重点 从狭义与广义角度理解文件理解文件描述符掌握open,write,read系统调用理解重定向的概念与原理掌握重定向的指令操作stdout与stderr的比较为什么存在stderr&#xff1f; 一、理解“文件” 1.1 狭义角度 在狭义层面&#xff0c;Linux文件是磁盘或存储设备上连续或分…