Time To Live(TTL) 集合
MongoDB 2.2 引入一個新特性–TTL 集合,TTL集合支持失效時間設置,或者在某個特定時間,
集合自動清除超時文檔,者用來保存一個諸如session會話信息的時候非常有用。
如果想使用TTL集合,用用到 expireAfterSeconds 選項
官網使用文檔設置方法:
Expire Documents after a Specified Number of Seconds
首先創建索引,設置過期時間
db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
- 1
然后存儲數據入庫
db.log_events.insert( {
"createdAt": new Date(),
"logEvent": 2,
"logMessage": "Success!"
} )
- 1
- 2
- 3
- 4
- 5
mongodb 會在大於 expireAfterSeconds 指定值的秒數后,過期
Expire Documents at a Specific Clock Time
與上面的設置類似
首先建立索引,設置 expireAfterSeconds 為 0
db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
- 1
然后存儲數據
db.log_events.insert( {
"expireAt": new Date('July 22, 2013 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
- 1
- 2
- 3
- 4
- 5
expireAt 的值為特定的時間值,等時間到達expireAt的值時,這個文檔就失效了。
補充說明
當你在集合中某一個字段建立TTL索引后,后台會有一個單線程,通過不斷查詢(默認60s一次)索引的值來判斷document是否有過期,並且刪除文檔的動作還依據mongod實例的負載情況,如果負載很高,可能會稍微延后一段時間再刪除。
還有一個需要注意的地方,在復制集成員中,TTL后台線程只刪除primary的過期數據,如果此實例變為secondary角色,則后台線程閑置。
修改TTL索引的expireAfterSeconds屬性值:
注:如果想更改過期時間expireAfterSeconds,可以使用collMod方法,要不然你只能只用dropIndex(),createIndex()方法重建索引了,我想這樣的方法在億級數據量下是很頭疼的
db.runCommand( { collMod: "log_events", ---集合名
index: { keyPattern: { createTime: 1 }, ---createTime為具有TTL索引的字段名
expireAfterSeconds: 7200 ---修改后的過期時間(秒)
}})
- 1
- 2
- 3
- 4
expireAt的好處在於,可以指定在什么時間過期,對於數據量大的服務器來說,白天如果大量數據過期,在一定程度上會增加負載,因而選擇在閑時,或者夜里過期,是一個比較明智的做法。
db.httpRequestLog.ensureIndex({"requestTime": 1},{expireAfterSeconds: 2592000})
