MongoDB 过期索引(TTL 索引)

MongoDB 索引 About 1,212 words

过期索引

TTL索引:Time To Live的缩写。在指定时间段删除数据。

固定过期时间

建立索引时就指定一个时间为过期删除时间。其中lastModifiedDate为自定义的日期类型,expireAfterSeconds为过期索引属性,单位为秒。

db.eventlog.createIndex(
    { "lastModifiedDate": 1 },
    { expireAfterSeconds: 3600 }
)

调整过期时间

使用collMod调整过期时间。

db.runCommand({
    collMod: "eventlog", ---集合名
    index: { 
        keyPattern: { lastModifiedDate: 1 }, ---createTime为具有TTL索引的字段名
        expireAfterSeconds: 7200  ---修改后的过期时间(秒)
    }
})

动态过期时间

建立索引时设置expireAfterSeconds属性为0

db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 0 } )

插入测试数据:指定3天后过期。

db.eventlog.insert( {
   "lastModifiedDate": new Date(ISODate().getTime() + 1000 * 3600 * 24 * 3)
} )

注意

  • 过期索引不保证过期的数据立马会删除。MongoDB的后台线程会每隔60秒扫描一次是否有过期数据,所以过期数据可能会比过期时间多存在60秒的时间。
  • 在副本集的模式中,后台线程只会删除primary节点的数据。secondary节点的后台线程会闲置不轮询工作,而是从primary节点复制删除操作来删除过期数据。
  • 过期索引只能使用在单一字段上,不能用在复合索引中。
  • _id字段不能创建过期索引。
  • 过期索引不能用在Capped Collections固定大小的集合中。
  • 不能使用createIndex()来调整过期时间,可以使用collMod命令来修改。
  • 如果某个字段(单字段)已经是非过期索引,则无法在同一字段上创建过期索引。必须首先删除原先的索引,然后使用expireAfterSeconds选项重新创建。

对比Redis

Redis的过期自动删除数据相比,MongoDB的自动删除数据不能保证原子性,对于一些原子性要求不高的业务可以选择使用MongoDB代替Redis

参考

https://docs.mongodb.com/manual/core/index-ttl

https://docs.mongodb.com/manual/tutorial/expire-data

Views: 5,300 · Posted: 2020-06-26

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh