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