• mongodb的TTL索引介绍(超时索引)


    TTL索引是mongodb新支持的用于延时自动删除记录的一种索引。它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引。可以指定某条记录在延时固定时间后自动删除。数据自动超时删除主要用在系统生成的事件、日志或者会话信息等不需要永久存储的数据。

    • 创建语法


    在集合eventlog的字段"lastModifiedDate"上创建延时1小时自动删除的TTL索引,其中"expireAfterSeconds"是超时字段,单位是秒。

    • 数据超时

    TTL索引会按设置的超时时间,自动定期把符合条件的文档删除,这里的符合是指索引字段的时间值超时:
    1. 该字段如果是一个数组,并且有多个有效的时间值,那么mongodb会按最早的时间值来计算是否超时。
    2. 如果某文档的该字段值不是Date类型或者数组中无有效时间值,那么该文档不会过期。
    3. 如果一个文档没有索引字段,那么它也不会过期。

    • 删除操作

    mongodb后台启动了一个线程来定期查询并删除符合条件的文档。
    当TTL线程在执行的时候,你可以通过db.currentOp() 查询执行状态。

    • 删除操作的执行时间

    如果以后台的方式创建了TTL索引,系统可以边创建索引边执行删除操作。如果是前台创建方式,则需要在创建完成后开始执行删除操作。
    后台线程会每个1分钟执行一次删除操作,因此TTL索引并不能保证文档在过期的时间点就能被删除,从文档过期到被删除可能会有一段间隔时间,这个间隔包含了线程执行的间隔和执行时删除文档的时间。

    • 复制组

    在复制组的成员中,只有主节点的后台线程会删除文档,其他从节点会同步这个删除操作。

    • 是否支持查询

    支持查询时使用TTL索引,同普通的索引一样。

    • 注意事项

    1. TTL索引仅支持一个字段,不能支持复合索引。
    2. _id字段不支持TTL索引。
    3. 不能再固定大小的集合上创建TTL索引。
    4. 不能通过createIndex()接口来改变expireAfterSeconds的值,可以通过"collMod"命令,或者先删除再创建的方式。
    5. 不能在已经建立索引的字段创建TTL索引。

    • 示例

    1. 创建索引

    mongos> db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 60 } )
    {
    "ok" : 1
    }

    2. 插入4条记录
    mongos> db.eventlog.insert({"title":"mongodb 1","lastModifiedDate":new Date()})
    WriteResult({ "nInserted" : 1 })
    mongos> db.eventlog.insert({"title":"mongodb 2","lastModifiedDate":new Date()})
    WriteResult({ "nInserted" : 1 })
    mongos> db.eventlog.insert({"title":"mongodb 3","lastModifiedDate":new Date()})
    WriteResult({ "nInserted" : 1 })
    mongos> db.eventlog.insert({"title":"mongodb 4","lastModifiedDate":new Date()})

    3. 查询记录

    mongos> db.eventlog.find()
    { "_id" : ObjectId("5a9697a671d2645a6fa3f9cb"), "title" : "mongodb 1", "lastModifiedDate" : ISODate("2018-02-28T11:51:02.804Z") }
    { "_id" : ObjectId("5a9697aa71d2645a6fa3f9cc"), "title" : "mongodb 2", "lastModifiedDate" : ISODate("2018-02-28T11:51:06.393Z") }
    { "_id" : ObjectId("5a9697ad71d2645a6fa3f9cd"), "title" : "mongodb 3", "lastModifiedDate" : ISODate("2018-02-28T11:51:09.416Z") }
    { "_id" : ObjectId("5a9697c671d2645a6fa3f9ce"), "title" : "mongodb 4", "lastModifiedDate" : ISODate("2018-02-28T11:51:34.499Z") }

    大概过了90s,再查询
    mongos> db.eventlog.find()
    mongos>

    果然同时消失了,说明执行超时删除不是实时的,而是60秒执行一次。

  • 相关阅读:
    细说MS事务管理
    大话设计模式(含源码)下载
    CSS基础到提高(PPT、视频、源代码),网页布局不用愁
    Android开发中Layout中明明改了id,但是还出现"cannot be resolved or is not a field"的原因
    读《OO真经》有感,以及我自己的关于哲学的体会
    Web服务小试牛刀
    在Android的RaletiveLayout中,如果空间的相对位置矛盾将不显示此控件
    .net 面试题2
    敏捷软件转
    中英文标点
  • 原文地址:https://www.cnblogs.com/xinghebuluo/p/8485458.html
Copyright © 2020-2023  润新知