【MongoDB】数据的自动过期,TTL索引

文章目录

  • 1. 前言
  • 2.概念与使用
    • 2.1.使用方式
    • 2.2.数组中包含日期字段
    • 2.3.设置具体的过期时间点
    • 2.4.额外的过滤条件
  • 3.总结

1. 前言

在近期的工作中,使用了MongoDB来保存了一些日志数据,但是这些日志数据具有一定的时效性,也就是按照业务的需要,保存xx天即可,在超过了这个时间之后,需要删除过时的日志。
按照之前的做法,可以使用定时任务,例如:Spring的定时器,xxl-job等工具,在每天凌晨的时候删除数据,这种方法虽然可行,但是需要额外的编码工作。

那有没有一种方式能够简单的搞定过期数据的清理呢?

当然,MongoDB提供了一种TTL索引的机制,可以非常方便的处理这种需求,下面是官方文档,有阅读能力的同学可以直接看这个文档。
《Expire Data from Collections by Setting TTL》

2.概念与使用

TTL的全称为 “Time To Live”,就是存活时间的意思,这是计算机中一个非常常见的概念,经常用于一些需要延时处理的任务,熟悉消息队列的同学肯定知道,延时队列实际上也是TTL的一种实践方式。

结合这个概念,MongoDB通过给数据创建TTL Index 也就是TTL索引的方式,在完成数据的过期和清理的任务。

2.1.使用方式

TTL Index 的使用方法的非常简单,只需要找到一个 日期类型 字段,给这个字段创建索引,并指定存活时间(expireAfterSeconds)就可以了。

我这里使用的MongoDB版本是最新的7.0.6,可以通过db.version();查看当前的版本号,太低的版本可能不支持这个功能。


先准备一条数据,然后创建索引:

db.log_test.insertOne({"createTime": new Date(),"msg": "Success!"
})db.log_test.find();

在这里插入图片描述

db.log_test.createIndex({ "createTime": 1 }, { expireAfterSeconds: 10 });db.log_test.getIndexes();

在这里插入图片描述
这里的expireAfterSeconds设置的是存活时间,单位:秒,在设置完成后,createTime与当前系统时间的差值大于 10s 的数据,将会被清理掉。是不是非常简单。

2.2.数组中包含日期字段

在上面已经创建索引的基础上, 看一下下面这个语句:

db.log_test.insertOne({"createTime": [new Date(),'asdf',111],"msg": "Success!"
});

在这里插入图片描述
猜一下,这样的数据还能够被自动清理吗?

实际上,这种数据会可以被自动清理的,即使字段值是一个数组,但它包含了日期类型的字段,TTL索引都能够生效。

那再进一步,如果数组中包含了多个日期字段呢?该使用哪一个日期呢?例如:

db.log_test.insertOne({"createTime": [new Date,ISODate("2024-04-20T13:48:18.428Z")],"msg": "Success!"
});

在这里插入图片描述
这种情况,数据也会在10秒后被删除掉。无关乎日期的大小,只要有任意一个日期满足过期的要求,就可以被删掉。

2.3.设置具体的过期时间点

上面说的都是设置一个数据的存活时间,不是固定的过期时间,如果想要设置固定的过期时间也非常简单,只需要把索引做一下变换。

db.log_test.createIndex({ "expireTime": 1 }, { expireAfterSeconds: 0 });

expireAfterSeconds设置为0,然后在expireTime字段上设置具体的时间就可以了。

2.4.额外的过滤条件

上述的情况都是针对全量的数据做过期处理,但可能有的时候我们可能想保留有些有价值的数据,这部分数据不加入自动过期的逻辑。这个时候可以在创建索引的时候加入部分过滤条件,如下:

db.log_test.createIndex({"createTime": 1},{name:"canExpireDataTTL",partialFilterExpression:{"canExpire":true}, // canExpire=true的字段会过期自动清理expireAfterSeconds: 10}
);

接下来插入两条数据:

db.log_test.insertOne({"createTime": [new Date()],"msg": "Success!","canExpire":true
});db.log_test.insertOne({"createTime": [new Date()],"msg": "Success!","canExpire":false
});

在这里插入图片描述
按照预期,在10秒后,canExpiretrue的数据将会被清理,false的数据将会保留。验证结果如下:
在这里插入图片描述
在这里插入图片描述

3.总结

TTL索引可以在不添加新的代码逻辑的情况下,非常简单清理已过期的数据,只需要在日期类型的字段上创建TTL Index就可以了,即使这个字段是数组,只要数组中有日期也可能生效。

需要注意的是:过期数据的清理工作是由MongoDB的后台线程周期性执行的,一般这个周期是60s执行一次,如果发现上述的数据在 10秒后还没有被删除的话也不用惊慌,数据将会在60s的周期内被清理掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1726.shtml

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

相关文章

mac可以玩steam吗 mac安装steam教程 苹果电脑能打steam游戏吗 苹果电脑怎么安装windows 苹果mac电脑配置AI功能的M4芯片

众所周知,Steam作为一个热门的游戏平台,深受国内外玩家的喜爱,平台中包含了无数的游戏,在作战时玩家们能够与朋友们互动聊天,还能匹配好友组队,同时还能增进与同伴的默契度。 但是最近有玩家们提问说&#…

MySQL数据库中备份和查询

总所周知我们用到的数据有可能丢失,那么我们就可以通过备份把数据找回,如何操作:请先看下面讲解 备份: 导出: 先对数据库进行备份,然后提取备份文件中的SQL语句 这就是我们导出数据,导出了就有…

关于conda占C盘内存的问题

文章目录 前言一、C盘中.conda文件中的envs二、C盘中.conda文件中的pkgs 前言 最近发现C盘空间越来越少,于是就去清理了一下conda在C盘的存储,不看不知道,一看吓一跳,足足十几G!于是去网上搜索了相关的包能不能删除&a…

电梯节能的推广意义

之前关于电梯能量回馈设备,小伍已经做了很多介绍,那么小伙伴们,他的推广意义你真的了解了么? 第一:节电降耗,电梯在运行过程中会产生大量的惯性能量,这些能量如果不被利用就会浪费。能量回馈技术…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

UDP文件传输工具之UDP怎么限流

UDP&#xff08;用户数据报协议&#xff09;以其低延迟和高速度的特点&#xff0c;在实时应用和大数据传输中扮演着重要角色。然而&#xff0c;UDP作为一种无连接的协议&#xff0c;并不保证数据包的顺序、完整性或可靠性。 因此&#xff0c;企业在寻求一种方式&#xff0c;有…

尝试给笔记本超频

超频&#xff08;英语&#xff1a;overclocking&#xff09;是把一个电子配件的时脉速度提升至高于厂方所定的速度运作&#xff0c;从而提升性能的方法&#xff0c;但此举有可能导致该配件稳定性以及配件寿命下降。 笔记本配置为&#xff1a; 处理器 AMD Ryzen 7 7730U wit…

【GlobalMapper精品教程】076:基于高程和影像数据创建电子沙盘(真实三维地形)

影像与数字高程模型叠加,可以构建三维真是地形。本文讲解在Globalmapper中基于高程和影像数据创建电子沙盘(真实三维地形)。 文章目录 一、加载数据二、创建三维网格三、三维叠加显示一、加载数据 本实验的数据(配套实验数据资料包中的data076.rar,订阅专栏,获取全文及数…

基于MLP算法实现交通流量预测

在浩如烟海的城市数据中&#xff0c;交通流量信息无疑是揭示城市运行脉络、洞察出行规律的关键要素之一。实时且精准的交通流量预测不仅能为交通规划者提供科学决策依据&#xff0c;助力提升道路使用效率、缓解交通拥堵&#xff0c;还能为公众出行提供参考&#xff0c;实现个性…

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…

QA测试开发工程师面试题满分问答15: 讲一讲InnoDB和MyISAM

InnoDB和MyISAM是MySQL中两种常见的存储引擎&#xff0c;它们在数据存储和处理方面有着显著的区别。让我们逐一来看一下它们的区别、原理以及适用场景。 区别&#xff1a; 事务支持&#xff1a;InnoDB是一个支持事务的存储引擎&#xff0c;而MyISAM不支持事务。事务是一种用于维…

mysql 重复单号 统计

任务&#xff1a; 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数据量 17、统计出现的重复次数 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数…

【机器学习】各大模型原理简介

目录 ⛳️推荐 前言 一、神经网络&#xff08;联结主义&#xff09;类的模型 二、符号主义类的模型 三、决策树类的模型 四、概率类的模型 五、近邻类的模型 六、集成学习类的模型 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风…

uniapp H5的弹窗滚动穿透解决

目录 方案一 事件修饰符 overscroll-behavior 修饰符 overscroll-behavior 属性 看个案例 兼容 方案二 overflow&#xff1a;hiden 有一层遮罩蒙层覆盖在body上时&#xff0c;当我们滚动遮罩层&#xff0c;它下面的内容也会跟着一起滚动&#xff0c;看起来好像是上面的…

冯唐成事心法笔记

文章目录 卷首语 管理是一生的日常&#xff0c;成事是一生的修行PART 1 知己 用好自己的天赋如何管理自我用好你的天赋成大事无捷径如何平衡工作和生活做一个真猛人做自己熟悉的行业掌控情绪如何对待妒忌和贪婪如何战胜自己&#xff0c;战胜逆境真正的高手都有破局思维有时候…

本地环境测试

1. 在 Anaconda Navigator 中&#xff0c;打开 Jupyter Notebook &#xff0c;在网页中&#xff0c;点击进入本地环境搭建中创 建的工作目录&#xff0c;点击右上角的 New- 》 Folder &#xff0c;将新出现的 Untitled Folder 选中&#xff0c;并使用左上角 的 Rename 按钮重…

白蚁自动化监测系统解放方案

一、系统介绍 白蚁自动化监测系统是基于物联网的各项白蚁监测点数据的采集形成智能控制系统。提供白蚁实时预警及解决方案&#xff0c;真正实现区域内白蚁种群消灭。白蚁入侵&#xff0c;系统第一时间自动报警&#xff0c;显示入侵位置&#xff0c;实现抓获白蚁于现场的关键环…

【Linux】认识文件(三):缓冲区

【Linux】认识文件&#xff08;三&#xff09;&#xff1a;缓冲区 一.啥是缓冲区&#xff1f;二.缓冲区现象三.缓冲区的刷新方法四.缓冲区在哪&#xff1f;五.为什么要有缓冲区 一.啥是缓冲区&#xff1f; 缓冲区&#xff0c;官方说法就是&#xff1a;指的是一块用于临时存储数…

LeetCode 409—— 最长回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 要想组成回文串&#xff0c;那么只有最中间的字符可以是奇数个&#xff0c;其余字符都必须是偶数个。 所以&#xff0c;我们先遍历一遍字符串&#xff0c;统计出每个字符出现的次数。 然后如果某个字符出现了偶…

vi, vim,data,wc,系统常用命令-读书笔记(十)

vi 文本编辑器 基本上 vi 共分为三种模式&#xff0c;分别是“一般指令模式”、“编辑模式”与“命令行命令模式”。这三种模式的作用分别是&#xff1a; 一般指令模式&#xff08;command mode&#xff09;以 vi 打开一个文件就直接进入一般指令模式了&#xff08;这是默认的…