MongoDB 2.2 的 Time To Live (TTL) 集合

類別: IT

MongoDB 2.2 引入一個新特性 —— TTL 集合,TTL 集合支援失效時間設定,當超過指定時間後,集合自動清除超時的文件,這用來儲存一些諸如session會話資訊的時候非常有用,或者儲存快取資料使用。

如果你想使用 TTL 集合,你要用到 expireAfterSeconds 選項: 
db.ttl.ensureIndex({"Date": 1}, {expireAfterSeconds: 300})


限制

使用 TTL 集合時是有限制的:
  • 你不能建立 TTL 索引,如果要索引的欄位已經在其他索引中使用
  • 索引不能包含多個欄位
  • 索引的欄位必須是一個日期的 bson 型別
如果你違反了上述三個規則,那麼超時後文件不會被自動清除。

文件是怎麼被刪除的?

mongod 後臺程式會實時跟蹤過期的文件並刪除,我們來對此進行檢查測試:

首先我們建立一個索引並設定 10 秒鐘後失效:

db.ttl_collection.ensureIndex( { "Date": 1 }, { expireAfterSeconds: 10 } )

然後插入文件:

db.ttl_collection.insert({"Date" : new Date()})

因為我們想象該文件會在 10 秒後刪除,可是我在我的電腦上測試多次,結果卻不太一樣。有些時候 mongod 在 18 秒後刪除,有些時候是 40 秒。為什麼會這樣呢?我們已經告訴 MongoDB 要在 10 秒後刪除,可事實上卻不是如此。
例如,這一次是 45 秒中後才刪除:


因為 mongod 後臺任務每分鐘檢查一次過期文件,因此在時間的處理上總有一定的差異,但這個差異不會超過 1 分鐘,這也取決於 MongoDB 例項當前的負荷情況。

能否為已存在的集合設定 TTL 索引


是的,當然可以。在設定 TTL 索引之前新增的文件,將會根據它們的 Date 欄位來決定是否刪除。

能否阻止文件被刪除?


可以,有兩種方法:
  • 文件被刪除之前更新 TTL 欄位
  • 為 TTL 欄位設定一個非日期型別的值
例如,如果我們給日期欄位設定值為 null,它就不會被刪除:

結論


Time To Live 集合是 MongoDB 2.2 新引入的一個非常棒的特性,但你需要考慮的是在後臺程式執行之前文件是一直存在的。
MongoDB 2.2 的 Time To Live (TTL) 集合原文請看這裡

推薦文章