定时任务删除MongoDB历史数据

ops/2024/11/30 5:51:00/

前言

MongoDB数据过多,导致存储成本飙升,为了降低成本,需要将历史数据删除。

删除逻辑

添加配置文件控制删除逻辑

syncconfig:deleteMongoConfig:#同步状态,true同步,false不同步syncStatus: true#删除数据的时间,一个月前deleteDays: 31#分布式锁keylockRedisKey: order.sync.deleteMongo#每次删除数量limit: 2

配置类

@ConfigurationProperties(prefix = "syncconfig")
@Configuration
@RefreshScope
@Data
public class SyncConfig {private DeleteMongoDto deleteMongoConfig;@Data@NoArgsConstructor@AllArgsConstructorpublic static class DeleteMongoDto {/*** 同步状态,true同步,false不同步*/Boolean syncStatus = false;/*** 删除的天数(createTime)*/Integer deleteDays = 186;/*** locakRedisKey,用于做分布式锁,防止定时任务执行时间较长,两个任务重叠执行*/String lockRedisKey;/*** 每次数量*/Integer limit = 1000;}
}

核心代码

    @PostMapping("/deleteMongo")public BaseResponse<String> deleteMongo() {return orderService.deleteMongo();}
 @Overridepublic BaseResponse<String> deleteMongo() {//获取配置信息SyncConfig.DeleteMongoDto deleteMongoDto = syncConfig.getDeleteMongoConfig();//判断同步是否开启if (deleteMongoDto == null || !deleteMongoDto.getSyncStatus()) {log.info("deleteMongosyncStatus=false,not sync");return ResponseUtils.success("deleteMongosyncStatus=false,not sync");}Boolean lockStatus = false;try {lockStatus = redisLockService.acquireLock(deleteMongoDto.getLockRedisKey());if (!lockStatus) {log.info("deleteMongo get lock fail,not sync");return ResponseUtils.fail("deleteMongo get lock fail,not sync");}//根据时间获取orderIdLong orderId = getOrderId(deleteMongoDto.getDeleteDays());Query query = new Query(Criteria.where("orderId").lt(orderId));query.limit(deleteMongoDto.getLimit());// 使用投影来只选择orderId字段query.fields().include("orderId");// 这里不用分页是因为分页会查询total效率较低,数据量大的时候耗费资源/*Pageable pageable = PageRequest.of(0, deleteMongoDto.getLimit());Page<orderDao> page = orderDao.findByOrderIdLessThan(orderId, pageable);List<Order> list = page.getContent();*/List<Order> list=mongoTemplate.find(query,Order.class);for (Orderitem :list) {orderDao.deleteById(item.getOrderId());}int count = 0;if (CollectionUtils.isNotEmpty(list)) {count = list.size();}return ResponseUtils.success("deleteMongo success,count:" + count);} catch (Exception ex) {log.error("deleteMongo Exception:" + ex.getMessage());return ResponseUtils.fail(ex.getMessage());} finally {//释放分布式锁if (lockStatus) {redisLockService.releaseLock(deleteMongoDto.getLockRedisKey());}}}//生成半年前的orderIdprivate Long getOrderId(Integer deleteDays) {LocalDateTime deleteTime = LocalDateTime.now().minusDays(deleteDays);// 将LocalDateTime转换为毫秒值ZonedDateTime utcZonedDateTime = deleteTime.atZone(ZoneId.systemDefault());long milliseconds = utcZonedDateTime.toInstant().toEpochMilli();Long orderId = (milliseconds / 1000) << 32;return orderId;}

总结

这里是简单的删除历史数据逻辑,可以参考执行,分布式锁是为了防止重复调用,实际使用的时候也可以不用分布式锁。然后定时调用这个删除接口即可不断的删除历史数据了


http://www.ppmy.cn/ops/137848.html

相关文章

Pytorch使用手册-使用 TensorBoard 可视化模型、数据和训练过程(专题十)

在 60 分钟速成课程中,我们展示了如何加载数据,将其传递通过我们定义的作为 nn.Module 子类的模型,训练该模型并在测试数据上进行测试。为了查看发生了什么,我们在模型训练过程中打印一些统计信息,以便了解训练是否进展顺利。然而,我们可以做得更好:PyTorch 与 TensorBo…

深入解析 EasyExcel 组件原理与应用

EasyExcel 是一个为了简化 Excel 操作&#xff0c;而封装的一个 Java 工具库。它支持读写 Excel 97-2003 和 Excel 2007 格式的文件。 以下是一个使用 EasyExcel 读取 Excel 文件的简单示例&#xff1a; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.read…

C++算法练习-day50——538.把二叉树转换为累加树

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 题目描述&#xff1a; 给定一个二叉搜索树&#xff08;BST&#xff09;&#xff0c;请将其转换为一个累加树&#xff08;Greater Tree&#xff09;&#xff0c;使得每个节点的值是原来的节点值加…

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…

sql工具!好用!爱用!

SQLynx的界面设计简洁明了&#xff0c;操作逻辑清晰易懂&#xff0c;没有复杂的图标和按钮&#xff0c;想对哪部分操作就在哪里点击右键&#xff0c;即使你是数据库小白也能轻松上手。 尽管SQLynx是一款免费的工具&#xff0c;但是它的功能却丝毫不逊色于其他付费产品&#xff…

大数据HCIA笔记1

概述 当下主流的流计算使用Flink Hadoop Hadoop的核心组件&#xff1a;HDFS(分布式文件系统)、Yarn(资源调度)、MapReduce(批量计算引擎) HDFS HDFS -- Hadoop Distributed File System HDFS核心进程&#xff08;组件&#xff09;&#xff1a;NameNode&#xff0c;DataNode Nam…

【MYSQL数据库相关知识介绍】

MySQL 在我们日常技术中是一个广泛使用的开源关系型数据库管理系统&#xff0c;所以作为测试同学&#xff0c;掌握mysql的相关知识是必不可少的技能之一&#xff0c;所以小编从软件测试的角色出发&#xff0c;来整理一些跟测试相关的知识&#xff0c;希望能够帮助到大家。 一、…

深入解析 DTO 模式及在 C# 中的应用

在现代软件开发领域&#xff0c;尤其是构建企业级应用、分布式系统以及遵循分层架构设计理念的项目里&#xff0c;数据传输对象&#xff08;Data Transfer Object&#xff0c;简称 DTO&#xff09;模式发挥着不可或缺的作用。它犹如一座桥梁&#xff0c;巧妙地跨越系统各层级、…