定时清理 MongoDB 历史数据
MongoDB Spring Boot cron 大约 1567 字需求
每晚9
点至第二天凌晨5
点,清理6
个月前的历史数据。
思路
执行定时任务,生成6
个月前的ObjectId
,判断小于该ObjectId
的,批量删除(每次10000
条删除)。因为默认_id
有索引,而无需再根据自定义的create_ts
等时间字段创建索引再删除了,可直接利用ObjectId
来完成,因为ObjectId
本来就由机器码+线程id+时间戳生成,故可以推得时间戳和使用指定时间生成ObjectId
。
代码
实现方案使用Spring Boot
+ Spring Data MongoDB
完成。
0 * 21-23,0-5 * * ?
定时任务跨天执行。
new ObjectId(Date)
指定时间生成ObjectId
。
@Slf4j
@SpringBootApplication
public class DemoApplication {
@Resource
private MongoTemplate mongoTemplate;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Scheduled(cron = "0 * 21-23,0-5 * * ?")
public void cron() {
clean();
}
public void clean() {
LocalDate localDate = LocalDate.now().minusMonths(6);
System.out.println(localDate.toString());
Date from = Date.from(localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant());
ObjectId objectId = new ObjectId(from);
System.out.println(localDate.toString() + "#" + objectId.toHexString());
log.info("now#{}, ObjectId#{}", localDate.toString(), objectId.toHexString());
Query query = Query.query(Criteria.where("_id").lt(objectId)).limit(10000);
long now = System.currentTimeMillis();
DeleteResult deleteResult = mongoTemplate.remove(query, Document.class, "test_col");
log.info("delete test_col result#{}-{}, cost#{}", deleteResult.wasAcknowledged(), deleteResult.getDeletedCount(), System.currentTimeMillis() - now);
}
}
完整代码
https://github.com/fendoudebb/learning/tree/master/java/learn-spring-boot/mongo-clean
阅读 3507 · 发布于 2020-06-02
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
Linux 查看 cron 定时任务执行日志阅读 5380
-
Android 禁止 EditText 弹出软件盘阅读 4243
-
Windows 使用 Chrome 调试运行在 iOS 设备的网页阅读 2144
-
minikube start 指定 Kubernetes 集群阅读 183
-
IDEA Debug 时断点提示 No executable code found at line 434 in class阅读 2666
-
软考-系统架构设计师:进程管理-银行家算法阅读 1298
-
IDEA 多个 Vue.js 工程识别 Webpack @ 别名阅读 321
-
Gradle 生成 gradlew 设置版本及属性阅读 4793
-
文件无改动但 IDEA 仍然显示有改动阅读 592
-
MySQL 存储 IP 地址阅读 1816