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。
参考
                Views: 6,200 · Posted: 2020-06-26
            
            ————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
 
        Loading...