MongoDB 2.2 的 Time To Live (TTL) 集合

jopen 12年前發布 | 25K 次閱讀 MongoDB NoSQL數據庫

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 秒中后才刪除:

MongoDB 2.2 的 Time To Live (TTL) 集合

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

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

是的,當然可以。在設置 TTL 索引之前添加的文檔,將會根據它們的 Date 字段來決定是否刪除。

MongoDB 2.2 的 Time To Live (TTL) 集合

能否阻止文檔被刪除?

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

MongoDB 2.2 的 Time To Live (TTL) 集合

結論

Time To Live 集合是 MongoDB 2.2 新引入的一個非常棒的特性,但你需要考慮的是在后臺進程運行之前文檔是一直存在的。

英文原文OSCHINA原創翻譯
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!