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

embedded/2024/9/23 20:13:07/

文章目录

  • 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.ppmy.cn/embedded/15307.html

相关文章

【Git教程】(十六)基于构建服务器的工作 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 基于构建服务器的工作 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备构建服务器3.2 构建服务器上的 Git3.3 比对本地开发版本与最后成功构建版本之间的差异3.4 基于构建历史的排错 4️⃣ 替代解决方案4.1 使用标签4.2 将构建历史放在中央版本库中 许多项目…

软考-系统集成项目管理中级--信息(文档)和配置管理

本章历年考题分值统计(16年11月及以后按新教材考的) 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 本章历年考题及答案解析 12、2018 年下半年第 14题 关于配置管理,不正确的是(14) A、配置管理计划制定时需了解组织结构环境和组织单元之间的联系 B、配置…

百种提权及手段一览系列第5集

特权升级的危险是显而易见的。通过提升权限,攻击者可以绕过网络安全措施,从而损害数据完整性、机密性和系统可用性。对于组织而言,这可能会导致数据泄露、系统停机以及潜在的法律和声誉后果。识别权限升级的迹象并部署预防性网络安全措施对于…

重磅!这本8.8分的Q1 On Hold期刊,或将迎来转机!

【SciencePub学术】低分期刊由于质量问题被On Hold很常见,但是高分期刊也被On Hold,那就值得警惕了。 小编最近听到风声,目前位于On Hold期刊之列,但影响因子最高的 chemosphere 或迎来转机! 图源:网络 …

第十五届蓝桥杯省赛第二场C/C++B组F题【狡兔k窟】题解(AC)

题意分析 有一个 n n n 个点, n − 1 n-1 n−1 条边的无向图,边权均为 1 1 1。 每个点隶属于一个集合,同一个集合的点可以互相传送。 给定 m m m 个询问,求 x , y x, y x,y 的最短距离。 最短路解法 步骤: 建…

Java,Python和Go语言语法差异对比

前段时间一直在找工作,比较颓废,很长时间都没有更新博客了,最近公司的项目需要用到Python语言和Go语言, 所以又重新学习了一下Python语言和Go语言,现在做一些总结,方便以后复习使用,同时也给其他…

go 这样做就是python

代码 package mainimport "fmt"func main() {var list []interface{}list append(list, 1, 2, 3)list append(list, "d", "d", 3.0)fmt.Println(list, "这是一个万能类型列表,这就是python")dict : map[interface{}]interface{}{&q…

AI预测体彩排列3第2套算法实战化测试第3弹2024年4月25日第3次测试

今天继续进行新算法的测试,今天是第3次测试。好了,废话不多说了,直接上图上结果。 2024年4月25日体彩排3预测结果 6码定位方案如下: 百位:4、5、3、6、1、0 十位:6、5、4、3、1、0 个位:6、2、7…