mongo ttl索引

db.log_events.find()                                     # 查找log_events里的所有数据
db.log_events.createIndex( { "LogDT": 1 }, { expireAfterSeconds: 3600 } )                              #设置log_events里的TTL过期索引清理时间为3600秒
db.runCommand( { collMod: "log_events",index: { keyPattern: { LogDT: 1 },expireAfterSeconds: 10800 }})       #修改过期索引时间,建议最好还是先drop在新建
db.log_events.getIndexes()                 #查找log_events里的所有索引
TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立,
并且字段类型必须是date类型或者包含有date类型的数组(如果数组中包含多个date类型字段,则取最早时间为过期时间)
官网介绍链接:https://docs.mongodb.com/v3.2/core/index-ttl/
当你在集合中某一个字段建立TTL索引后,后台会有一个单线程,通过不断查询(默认60s一次)索引的值来判断document是否有过期,
并且删除文档的动作还依据mongod实例的负载情况,如果负载很高,可能会稍微延后一段时间再删除。
还有一个需要注意的地方,在复制集成员中,TTL后台线程只删除primary的过期数据,如果此实例变为secondary角色,则后台线程闲置
限制条件:
有一下集中情况是无法使用TTL索引的
①TTL索引是单字段索引,混合索引不支持TTL,并且也会忽略expireAfterSeconds属性
②在_id 主键上不能建立TTL索引
③在capped collection中不能建立TTL索引,因为MongoDB不能从capped collection中删除文档
④你不能使用createIndex()去更改已经存在的TTL索引的expireAfterSeconds值,如果想更改expireAfterSeconds,可以使用collMod命令,
否则你只能删除索引,然后重建了
⑤你不能在已有索引的字段上再创建TTL索引了,如果你想把非TTL索引改为TTL索引,那就只能删除重建索引了
验证:
虽然已经实现了晚上集中自动删除的功能,但是还是担心删除过大数量时负荷问题,随进行了简单测试,一查看TTL索引在亿级别集合中删除140万过期数据的消耗
测试配置:
OS:Vm虚拟机
CPU: 4
内存:8
集合数据量:
> db.t1.count()
104273617
因为我制造测试数据时,_id是顺序增加的,所以我直接查看_id=1500000的那笔数据的createTime,然后自己计算一下此createTime和当前时间的时间差,
随后根据这个时间差来更改expireAfterSeconds的值,以让这150万数据5分钟后过期并删除。
在修改完expireAfterSeconds后,就严密延时“ vmstat 1 ” 命令的输出数据;
我的测试结果:
删除操作整个过程在90秒左右完成;
CPU最高占用90%,平均在50%
内存占用3G
这个也是特别准确的模拟情况,只是粗略的了解一下TTL索引的资源消耗,以决定是不是需要这样的方式来实现删除过期数据
监控vmstat的截图:

 

创建TTL索引方法:
和普通索引的创建方法一样,只是会多加一个属性而已
例:在log_events的集合中,createTime 字段上建立一小时后过期的TTL索引
[sql] view plaincopy
  1.  >db.log_events.createIndex( { "createTime": 1 },     ---字段名称   
  2.                                 { expireAfterSeconds: 60*60 } )     ---过期时间(单位秒)  
  3. >db.log_events.getIndexes()     ---查看索引  
  4. [  
  5.         {  
  6.                 "v" : 1,  
  7.                 "key" : {  
  8.                         "_id" : 1  
  9.                 },  
  10.                 "name" : "_id_",  
  11.                 "ns" : "tt.t1"  
  12.         },  
  13.         {  
  14.                 "v" : 1,  
  15.                 "key" : {  
  16.                         "createTime" : 1  
  17.                 },  
  18.                 "name" : "createTime_1",  
  19.                 "ns" : "tt.t1",  
  20.                 "expireAfterSeconds" : 3600  
  21.         }  
  22. ]  
修改TTL索引的expireAfterSeconds属性值:
注:如果想更改过期时间expireAfterSeconds,可以使用collMod方法,要不然你只能只用dropIndex(),createIndex()方法重建索引了,我想这样的方法在亿级数据量下是很头疼的
[sql] view plaincopy
  1. db.runCommand( { collMod: "log_events",     ---集合名  
  2.                 index: { keyPattern: { createTime: 1 },     ---createTime为具有TTL索引的字段名  
  3.                           expireAfterSeconds: 7200          ---修改后的过期时间(秒)  
  4.                         }})  
虽然上面的方法可以实现自动过期删除,但是如果白天业务很忙,频繁的删除数据势必会增加负载,所以我想着晚上定时删除过期数据(如果晚上业务量少的话)
方法如下:
增加一个expireTime字段(用于指定过期时间),expireAfterSeconds属性值设置为0,
注:上面的createTime字段就不需要再有TTL索引了,这个expireTime的时间就需要在插入时指定上
[sql] view plaincopy
  1. >db.log_events.createIndex( { "expireTime": 1 },     ---字段名称  
  2.                                 { expireAfterSeconds: 0 } )     ---过期时间(单位秒)  
  3. >db.log_events.insert( {  
  4.   "expireTime": new Date('Jan 22, 2016 23:00:00'),     ---此文档将在2016-1-22的23点自动删除  
  5.   "logEvent": 2,  
  6.   "logMessage": "Success!"} )  


这样我们就实现了,指定时间自动删除的动作了

一、TTL索引

创建方法db.collection.createIndex(keys, options)options:expireAfterSeconds 指定多少秒或者包含日期值的数组创建示例db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } ) 何时失效 在指定的时间达到后失效,也即是索引字段的值加上一个特定的秒数之后 如果索引字段是一个数组,即索引字段上存在着多个日期值,此时MongoDB取最小值加上失效时间(lowest()) 对于非日期字段或不包含日期数组的索引字段,文档不会失效 对于不包含索引字段的文档,文档不会失效 删除操作 mongod的一个后台线程会读取索引的值并将失效的文档从集合移除 当TTL线程被激活后,可以从db.currentOp()或者从profile观察到删除操作 何时删除 当基于后台方式创建索引时,TTL线程能够在索引创建期间开始删除失效文档 当基于前台方式创建索引时,TTL线程在索引创建完成后开始删除失效文档 TTL索引的删除不能完全保证失效期后一定删除,存在一定延迟(取决于mongod的工作负载) TTL删除文档后台线程每60s移除失效文档(因此可能存在已过失效期,文档还在的情形) 在副本集环境中,TTL后台线程仅仅在主副本上工作,辅助副本上由复制操作实现 在使用TTL索引查询时,与使用非TTL索引一样 一些限制 不能基于已经存在索引的字段创建TTL索引以及非日期字段创建TTL索引,文档不会失效 TTL索引不支持基于多个字段的复合索引 不支持定长集合

二、TTL索引示例

# mongo --shell localhost:27000 TTLData.js  
MongoDB shell version: 3.2.11 connecting to: localhost:27000/test repSetTest:PRIMARY> addTTLTestData()  //添加集合数据 Create three records in database each with a create time that is 1 minute apart Created three test documents, oldest being 4 mins old Now create a TTL index with expiry of 5 mins on the createDate field as follows db.ttlTest.ensureIndex({createDate:1}, {expireAfterSeconds:300}) repSetTest:PRIMARY> db.ttlTest.find()  //当前向集合里插入了3个文档 { "_id" : 1, "createDate" : ISODate("2017-03-10T03:23:01.169Z") } { "_id" : 2, "createDate" : ISODate("2017-03-10T03:24:01.169Z") } { "_id" : 3, "createDate" : ISODate("2017-03-10T03:25:01.169Z") }  //下面为测试集合上的文档添加索引,即5分钟后索引失效 repSetTest:PRIMARY> db.ttlTest.createIndex({createDate:1}, {expireAfterSeconds:300}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1,  // Author : Leshami "numIndexesAfter" : 2,  // Blog : http://blog.csdn.net/leshami "ok" : 1 }  //查找文档 repSetTest:PRIMARY> db.ttlTest.find() { "_id" : 1, "createDate" : ISODate("2017-03-10T03:23:01.169Z") } { "_id" : 2, "createDate" : ISODate("2017-03-10T03:24:01.169Z") } { "_id" : 3, "createDate" : ISODate("2017-03-10T03:25:01.169Z") }  //当指定时间到期后,文档被删除,如下,查询不到任何文档 repSetTest:PRIMARY> db.ttlTest.find()
 

转载于:https://www.cnblogs.com/liqing1009/p/8421621.html

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

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

相关文章

Linux Centos下SQL Server 2017安装和配置

Linux Centos下SQL Server 2017安装和配置 原文:Linux Centos下SQL Server 2017安装和配置我们知道在Linux下安装服务有很多方式,最为简单的也就是yum安装,但是很多服务通过yum是无法安装的,如果想使用yum安装,需要指定yum安装仓库…

如何在Linux上使用端口敲门(以及为什么不应该这样做)

Photographee.eu/ShutterstockPhotographee.eu/ShutterstockPort knocking is a way to secure a server by closing firewall ports—even those you know will be used. Those ports are opened on demand if—and only if—the connection request provides the secret knoc…

小到年货大到产业,刘村长的扶贫模式有点厉害!

河北省阜平县平石头村的村民,今年春节再也不用头疼买什么年货,去哪买年货的问题了,因为他们的“村长”刘强东,给每户人家都送来了年货大礼包!大礼包里不仅有牛奶、果汁、毛衣、长裤、波司登羽绒服、枕头、毛巾、炊大皇…

java - 匿名类

匿名内部类 概念:即内部类的简化写法 前提:存在一个类(可以是具体类也可以是抽象类)或接口 格式:new 类名或接口名{重写的方法} 本质:创建的是继承了类或实现了接口的子类匿名对 象。 匿名类总是final&…

leetcode 342. Power of Four

没想出来不用循环的。记录下。 如果是2的次方&#xff0c;必有num & (nums - 1) bool isPowerOfFour(int num) {if (num < 1) return false;if (num & (num - 1)) return false; // 排除不是2的倍数if (num & 0x55555555) return true; // 排除不是4的倍数&am…

克隆ubuntu硬盘_使用Ubuntu Live CD克隆硬盘

克隆ubuntu硬盘Whether you’re setting up multiple computers or doing a full backup, cloning hard drives is a common maintenance task. Don’t bother burning a new boot CD or paying for new software – you can do it easily with your Ubuntu Live CD. 无论是设置…

页面缓存处理的几种方法

html只要加在头部就可以了. <HEAD> <META HTTP-EQUIV"Pragma" CONTENT"no-cache"> <META HTTP-EQUIV"Cache-Control" CONTENT"no-cache"> <META HTTP-EQUIV"Expires" CONTENT"0"> </H…

Nginx的Mainline version、Stable version、Legacy version的版本区别

Nginx官网提供了三个类型的版本Mainline version&#xff1a;Mainline 是 Nginx 目前主力在做的版本&#xff0c;可以说是开发版Stable version&#xff1a;最新稳定版&#xff0c;生产环境上建议使用的版本Legacy versions&#xff1a;遗留的老版本的稳定版 nginx下载地址&…

从Boxee的Amie Street访问音乐

One of our favorite sites for discovering new music is Amie Street. Today we take a look at the Amie Street app for Boxee that allows you to access your favorite tunes from the Boxee interface. 我们最喜欢的发现新音乐的网站之一是Amie Street。 今天&#xff0…

redis学习目录

redis学习目录 redis安装 说明 python中使用 centos7安装redis redis.conf配置信息详解 redis主从同步 redis持久化 RDB与AOF redis不重启,切换到RDB备份到AOF备份 redis哨兵功能 redis-cluster(集群) 转载于:https://www.cnblogs.com/yuncong/p/10293624.html

如何在SpringBoot项目中使用拦截器

相比springmvc&#xff0c;springboot中拦截器不需要在xml中配置&#xff0c;只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebMvcConfigurerAdapter 1.SessionInterceptor package com.example.demo;import org.springframework.web.serv…

如何在Word,Excel和PowerPoint 2010中裁剪图片

When you add pictures to your Office documents you might need to crop them to remove unwanted areas, or isolate a specific part. Today we’ll take a look at how to crop images in Office 2010. 将图片添加到Office文档时&#xff0c;可能需要裁剪它们以删除不需要…

Python 调度算法 死锁 静动态链接 分页分段

1 select poll epoll的区别基本上select有3个缺点: 连接数受限查找配对速度慢数据由内核拷贝到用户态poll改善了第一个缺点 epoll改了三个缺点. (1&#xff09;select&#xff0c;poll实现需要自己不断轮询所有fd集合&#xff0c;直到设备就绪&#xff0c;期间可能要睡眠和唤醒…

在Windows 7 Media Center中创建音乐播放列表

One of the new features in Windows 7 Media Center is the ability to easily create music playlists without using Media Player. Today we’ll take a closer look at how to create them directly in Media Center. Windows 7 Media Center的新功能之一是无需使用Media …

(转)WebSphere的web工程中怎么获取数据源

原文&#xff1a;http://aguu125.iteye.com/blog/1694313 https://blog.csdn.net/bigtree_3721/article/details/44900325-------JNDI之java:comp/env was配置数据源和tomcat是不同的。tomcat只需要配置tomcat 的service.xml或者content.xml&#xff0c;然后 WEB程序就不需要配…

阿里数据库内核月报:2017年04月

摘要&#xff1a;阿里数据库内核月报&#xff1a;2017年04月# 01 MySQL 源码分析 MySQL 半同步复制数据一致性分析# 02 MYSQL 新特性 MySQL 8.0对Parser所做的改进# 03 MySQL 引擎介绍 Sphinx源码剖析&#xff08;二&#xff09;# 04 PgSQL 特性分析 checkpoint机制浅析…

SQL Server2008导入导出数据库

一、导出数据库 1.新建一个.bak的文本 右击数据库--》Tasks--》BackUp--》Remove原来的数据库--》Add后选择之前建立的.bak档 二、导入数据库 1.右击数据库--》Tasks--》Restore--》Database--》From device--》勾选数据库之后--》点击左上角Options--》点击 --》OK覆盖 转载于…

如何使YouTube视频连续循环播放

Should you need a YouTube video on a continuous loop, a few methods can help you keep repeating a video without having to start it over manually. Here’s how to do it. 如果您需要连续循环播放YouTube视频&#xff0c;可以采用以下几种方法来继续播放视频&#xff…

Android ABI

2019独角兽企业重金招聘Python工程师标准>>> 获取当前ABI var supportsABIs:Array<String>? null if(Build.VERSION.SDK_INT > 21) {supportsABIs Build.SUPPORTED_ABIS } var currentABI Build.CPU_ABI 通过Build可以获取当前手机支持的abi集以及cpu的…

nginx限流健康检查

Nginx原生限流模块:ngx_http_limit_conn_module模块根据前端请求域名或ip生成一个key&#xff0c;对于每个key对应的网络连接数进行限制。配置如下:http模块server模块#http模块内 http {include mime.types;default_type application/octet-stream;log_format main [$t…