相关文章推荐

每晚 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

阅读 4496 · 发布于 2020-06-02

————&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspEND&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

 
推荐文章