【Springboot系列】项目启动时怎么给mongo表加自动过期索引

news/2024/11/19 4:21:24/

1、前言

在之前操作mongo的过程中,都是自动创建,几乎没有手动创建过表。

这次开发中有张表数据量大,并且不是特别重要,数据表维护一个常见的问题是过期数据没有被及时清理,导致数据量过大,查询变得缓慢。为了解决这个问题,我们可以通过创建过期索引来定期清理过期数据。

数据过期的原理可以看下之前的文章:我屮艸芔茻,mongo居然可以自动删除数据

2、直接上代码

逻辑很简单,在服务器启动之后去检查索引

1.先检查存不存在这个索引

2.然后创建索引

3.在每个entity中增加了一个save_time的字段

package com.tyjt.ccpparking.mgr;import com.tyjt.ccpparking.domain.entity.ParkingHBEntity;
import com.tyjt.ccpparking.domain.entity.ParkingRestInfoEntity;
import com.tyjt.ccpparking.msg.EmqxHBHandler;
import com.tyjt.ccpparking.service.ParkingService;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.Index;
import org.springframework.data.mongodb.core.index.IndexDefinition;
import org.springframework.data.mongodb.core.index.IndexInfo;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Component
@Data
public class Mgr implements ApplicationRunner {private static Logger logger = LoggerFactory.getLogger(Mgr.class);@ResourceMongoTemplate mongoTemplate;public Mgr() {mgr = this;}private static Mgr mgr;public static Mgr getInstance() {return mgr;}@Overridepublic void run(ApplicationArguments args) throws Exception {createMongoIndex(ParkingHBEntity.class);createMongoIndex(ParkingRestInfoEntity.class);}/*** 创建mongo的索引** @param clazz*/public void createMongoIndex(Class clazz) {try {if (isIndexExists(clazz)) {return;}Index index = new Index();index.on("save_time", Sort.Direction.DESC);index.expire(7, TimeUnit.DAYS);mongoTemplate.indexOps(clazz).ensureIndex(index);} catch (Exception e) {logger.error("create index fail {}", clazz.getName(), e);}}public boolean isIndexExists(Class clazz) {List<IndexInfo> indexInfos = mongoTemplate.indexOps(clazz).getIndexInfo();for (IndexInfo indexInfo : indexInfos) {if ("save_time_-1".equals(indexInfo.getName())) {return true;}}return false;}
}

注:这里可以直接接写collection name,

也可以使用实体的class,因为mongo的entity的注解有@Document(collection = "parking_HB")

 注:在删除表的时候也会删除索引

3、总结

在Mongo数据库中创建过期索引,定期清理过期数据以保证数据的质量和性能。

创建过期索引可以大大简化过期数据的清理过程,并且可以帮助我们避免在查询和数据分析时出现问题。

同时,定期清理过期数据可以提高查询和分析的效率,保证系统的性能。

希望本文对您在Mongo数据库管理和维护方面有所帮助。如果您有任何问题或建议,请在下方留言区留言,我将尽快回复


http://www.ppmy.cn/news/51038.html

相关文章

ios客户端学习笔记(三):学习Swift的设计模式

设计模式是指在软件开发中常用的一些解决问题的方法和思想&#xff0c;它可以帮助你更好地组织代码和提高代码的可维护性。你需要学习常见的设计模式&#xff0c;如MVC、MVVM、单例模式、工厂模式等&#xff0c;在开发应用程序时应用它们。 当你学习常见的设计模式时&#xff…

线程常用方法

线程常用方法 setName() //设置线程名称&#xff0c;使之与参数name相同getName() //返回该线程的名称start() //使该线程开始执行&#xff1b;Java虚拟机底层调用该线程的start0方法run() //调用线程对象run方法&#xff1b;setPriority() //更改线程的优先级getPrio…

Utilities非默认目录构建和安装

在AppArmor零知识学习八、源码构建&#xff08;5&#xff09;中&#xff0c;详细介绍了Utilities的构建步骤&#xff0c;但那完全使用的是官网给出的默认参数。如果需要将目标文件生成到指定目录而非默认的/usr&#xff0c;则需要进行一些修改&#xff0c;本文就来详述如何进行…

gitee教程精简版

$ git config --global user.name "Your Name" $ git config --global user.email "emailexample.com" 设置名字和邮箱 初始化 git init git add test.txt 将文件预先添加到git仓库 git commit -m "刚刚我创建了一个文本"提交给git仓库&#x…

MySQL学习笔记第三天

第04章 运算符 1.算术运算符 算术运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;和取模&a…

S32k3系列开发学习(FlexCAN)

前言 由于之前没有接触过CAN总线模块&#xff0c;对这一块的知识仍比较陌生&#xff0c;于是乎想简单梳理一下CAN总线的工作流程&#xff0c;加深理解。 一、CAN是什么&#xff1f; 参考&#xff1a;https://zhuanlan.zhihu.com/p/346696648 二、CAN框架 各模块功能如下&am…

【vue3学习系列】对比vue2生命周期做了哪些改变,vue3初学者快来看看

文章目录 前言官方生命周期图分析去除beforeCreate与createdsetup代替created其他钩子只是改了名称 剔除vue2后的生命周期图其他钩子函数keepalive错误捕获其他的一些钩子去官方文档看看即可 前言 看了下官方的生命周期的说明&#xff0c;感觉讲的不算太清晰&#xff0c;所以个…

Verilog阻塞与非阻塞赋值详解

基本概念 关于阻塞赋值&#xff08;&#xff09;和非阻塞赋值&#xff08;<&#xff09;&#xff0c; 阻塞赋值&#xff08;&#xff09;是顺序敏感的&#xff0c;非阻塞赋值&#xff08;<&#xff09;是顺序独立的。阻塞赋值按它们在程序块中列出的顺序顺序执行。当它们…