【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的周期内被清理掉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

活动回顾丨雀跃山城•2024重庆爱鸟周主题公益活动落地大坪大融城

重庆,这座美丽的山城,不仅有着独特的山水风光,更是众多鸟类栖息繁衍的家园。重庆将四月第一周定为“重庆爱鸟周”,为提高青少年珍稀动物保护意识,4月20日,大坪大融城携手传益千里开展雀跃山城?2024重庆爱鸟…

cox版本的Boruta+SHAP分析(心力衰竭数据集)

Cox版本的BorutaSHAP分析(心力衰竭数据集) Boruta算法是变量筛选的有力工具,而SHAP分析是观察预测变量与结局变量间关系的不错的方法,在传统的分析方法的基础上提供了一个全新的视角。Boruta算法SHAP分析,正在逐渐成为…

Python代码格式化工具Black介绍

Black 是一个 Python 代码格式化工具,以其简洁和一致的格式化风格而闻名。它被设计为一个“零妥协”的代码格式化程序,意味着它会自动地将代码格式化为一种统一的风格,而不需要用户进行任何配置。Black 严格遵循 PEP 8 -- Python 的官方编码风…

笔试狂刷--Day2(模拟高精度算法)

大家好,我是LvZi,今天带来笔试狂刷--Day2(模拟高精度算法) 一.二进制求和 题目链接:二进制求和 分析: 代码实现: class Solution {public String addBinary(String a, String b) {int c1 a.length() - 1, c2 b.length() - 1, t 0;StringBuffer ret new StringBuffer()…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程,涉及多个方面和阶段。以下是一些关键步骤和考虑因素,帮助你制定一个有效的产品运营规划: 1、明确产品定位和目标用户: 确定产品的核心功能、特点和优势,明确产品在市…

Ubuntu 22最新dockers部署redis哨兵模式,并整合spring boot和配置redisson详细记录(含spring boot项目包)

dockers部署redis哨兵模式,并整合spring boot 环境说明相关学习博客一、在docker中安装redis1、下载dockers镜像包和redis配置文件(主从一样)2、编辑配置文件3、启动redis(主从一样)4、进入容器测试(主从一…

快速上手Jemter分布式压测实战和代码详细解析

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

MySQL的事务相关的语句的使用

MySQL的事务相关的语句的使用 事务是数据库管理系统执行过程中的一个程序单位,由一个或多个数据库操作组成。MySQL作为一款流行的关系型数据库管理系统,支持事务处理,允许用户定义一系列的操作,这些操作要么完全执行,…

每日OJ题_其它背包问题③_力扣377. 组合总和 Ⅳ(似包非包)

目录 力扣377. 组合总和 Ⅳ(似包非包) 解析代码 力扣377. 组合总和 Ⅳ(似包非包) 377. 组合总和 Ⅳ 难度 中等 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 t…

随着深度学习的兴起,浅层机器学习没有用武之地了吗?

深度学习的兴起确实在许多领域取得了显著的成功,尤其是那些涉及大量数据和复杂模式的识别任务,如图像识别、语音识别和自然语言处理等。然而,这并不意味着浅层机器学习(如支持向量机、决策树、朴素贝叶斯等)已经失去了…

【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat

🎥 屿小夏 : 个人主页 🔥个人专栏 : Linux深造日志 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、nano1.1 打开文件:1.2 常用快捷键:1.3 其他功能&#xff…

PaddleSeg开始与搭建

因为使用的比较多,所以来总结一下。 先介绍一下,为什么用PaddleSeg 1、搭建模型更容易,和MMSeg相比,配置更加简单,容易上手 缺点是 1、目前版本还无法生成热力图,我看Paddle官方已经出比赛在解决这个问题了 2、和主流pytorch存在一定差别,模型迁移时需要熟悉两种配置;M…

DBA-现在应该刚刚入门吧

说来话长 在2023年以前,我的DBA生涯都是“孤独的”。成长路径除了毕业前的实习期有人带,后续几乎都是靠自学。如何自学,看视频、看文档、网上查阅资料、项目实战。 可能是学疏才浅 ,一直都是在中小公司混,在中小公司通…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块,本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

深入理解VGG网络,清晰易懂

深入理解VGG网络 VGG网络是深度学习领域中一个非常经典的卷积神经网络(CNN)架构,由牛津大学的视觉几何组(Visual Geometry Group)提出。它在2014年的ImageNet挑战赛中取得了第二名的好成绩,并且在随后的许…

3ds Max2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 3ds Max是一款基于PC系统的强大3D建模、渲染和制作软件,广泛应用于游戏开发、影视后期制作、建筑设计、工业设计等多个领域。其拥有丰富的建模工具,可轻松创建逼真的三维场景和模型;同时&#…

揭秘!综合布线可视化管理软件如何助力集成商实现价值飞跃?

一、弱电集成商发展现状 近期小编通过与多家做弱电集成的朋友交流探讨了解到目前弱电集成商发展如同2024年国内大部分企业一样举步维艰,当然也有个别企业做的项目优质并且利润可观,但是整体不多,总结原因主要有以下几点: 工程项目…

【git】git ignore如何添加core/config.py忽略

在Git中,.gitignore文件用于指定不被Git追踪的文件和文件夹。要添加core/config.py文件到.gitignore中,你需要编辑.gitignore文件并添加以下行: core/config.py这行表示Git应该忽略名为config.py的文件,它位于core目录下。确保在…

【剪映专业版】17高质量视频如何导出

视频课程:B站有知公开课【剪映电脑版教程】 1.导出 目的:导出高质量的视频 如果没有音频及字幕的情况下,音频导出和字幕导出为灰色 2.视频导出 超清:1080P 注意:如果原始素材的分辨率为小于1080P,如果导…

算法:期望场景;鲁棒优化

部分代码 for i1:T stst[D_DGk(i)*min_P_DG<P_DGk(i)<D_DGk(i)*max_P_DG]; end for i2:T indicatorD_DGk(i)-D_DGk(i-1); rangei:min(T,iT_up-1); st st[D_DGk(range)>indicator]; end for i2:T indicatorD_DGk(i-1)-D_DGk(i); rangei:min(T…