定时任务删除MongoDB历史数据

前言

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.rhkb.cn/news/481419.html

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

相关文章

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…

redis的应用----缓存

redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…

【S500无人机】--地面端下载

之前国庆的时候导师批了无人机&#xff0c;我们几个也一起研究了几次&#xff0c;基本把无人机组装方面弄的差不多了&#xff0c;还差个相机搭载&#xff0c;今天我们讲无人机的调试 硬件配置如下 首先是地面端下载&#xff0c;大家可以选择下载&#xff1a; Mission Planne地…

C++设计模式(装饰模式)

一、介绍 1.动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b;并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff0…

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中&#xff0c;服务网关是一个至关重要的组件。它作为系统的入口&#xff0c;负责接收客户端的请求&#xff0c;并将这些请求路由到相应的后端服务…

MySQL底层概述—7.优化原则及慢查询

大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模拟查询优化器来执行SQL查询语句&#xff0c;从而知道MySQL是如何处理SQL语句的&#xff0c;从而分析出查询语句…

【前端】Vue3+Vite如何进行多环境配置呢

在项目或产品的迭代过程中需要分不同的环境&#xff0c;那么使用vitevue3开发时&#xff0c;该如何进行配置呢 1、添加配置文件 .env.xxx .env.xxx 需要与src在同一级目录下 例如&#xff1a; 开发环境&#xff1a; .env.development 开发环境&#xff1a; .env.test 生产环…

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息 0、测试环境1、mod_sms模块安装2、编写聊天规则2.1 使用xml文件测试一下 2.2 使用脚本文件测试一下 0、测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH界面…

广域网技术

企业需要通过广域网将这些分散在不同地理位置的分支机构连接起来 早期广域网技术概述 广域网&#xff1a;连接不同地区局域网的网络&#xff0c;能够横跨几个洲提供远距离通信&#xff0c;形成国际性的远程网络 广域网设备角色介绍&#xff1a; CE&#xff1a;用户端连接服务…

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流&#xff0c;基本编解码&#xff0c;倒叙&#xff0c;栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码&#xff0c;再base64解码&#xff0c;看到一个时间是倒叙&#xff0c;不含flag 继续往下面翻&#xff0c;可以看到cat%2Ff14g%7…

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…

Socket编程(TCP/UDP详解)

前言&#xff1a;之前因为做项目和找实习没得空&#xff0c;计算机网络模块并没有写成博客&#xff0c;最近得闲了&#xff0c;把计算机网络模块博客补上。 目录 一&#xff0c;UDP编程 1&#xff09;创建套接字 2&#xff09;绑定端口号 3&#xff09;发送与接收数据 4&…

虚拟机VMware安装OpenWrt镜像

前提已经安装VMware Workstation Pro,我使用的是VM16 一.下载OpenWrt系统固件 固件有很多种&#xff0c;我选择下面这个链接的固件: Index of /releases/23.05.3/targets/x86/64/ 二.把固件转换成虚拟机能识别的格式 转换工具下载地址&#xff1a;https://www.starwindsoft…

【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title><style typ…

计算机编码存储+char占用空间+final作用

内存中存储的是对应的编码&#xff0c;与对应的形状库一起能够在显示器显示出来对应的字符。 磁盘中存储的是文件信息。 内存中存储的是变量&#xff08;虽然也是在磁盘里&#xff0c;等到使用的时候再调入进来&#xff09;。 因为编码实质就是二进制串&#xff0c;所以也可以比…

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…

2-2-18-9 QNX系统架构之文件系统(一)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|数据分享

全文链接&#xff1a;https://tecdat.cn/?p38442 分析师&#xff1a;Yufei Guo 在现代土木结构工程领域&#xff0c;结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法&#xff0c;如目视检查以及借助专业设备进行检测&#x…

MyBatis的if标签的基本使用

在MyBatis框架中&#xff0c;if标签用于在构建SQL语句时&#xff0c;根据参数条件判断的结果&#xff0c;动态地选择加入或不加where条件中。 一 常见使用 在使用MyBatis处理查询逻辑的时候&#xff0c;常用的是判断一些参数是否为空&#xff0c;列举常用的几种情况展示 1.1…

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…