2012-02-18 33 views
4

我試圖從redis移動到dynamoDB和sofar一切都很好!我還沒有弄清楚唯一的關鍵是到期。目前,我有我有一個主鍵,沒有範圍鍵使數據設置:如何使用Boto在dynamoDB中過期的密鑰?

{ 
    "key" => string, 
    "value" => ["string", "string"], 
    "timestamp" => seconds since epoch 
} 

我想是在數據庫其中timestamp低於特定值做一個掃描,然後明確刪除它們。然而,這看起來效率極低,並且會無緣無故地使用一些荒謬的讀/寫單元!最重要的是,到期只會在我運行掃描時發生,所以他們可以想象建立起來。

那麼,有沒有人找到一個很好的解決這個問題?

回答

1

您可以使用時間戳作爲範圍鍵,該範圍鍵將被編入索引,並可根據時間更輕鬆地執行操作。

+0

確實沒有任何基於時間的操作......這只是一段時間後的數據變得陳舊和我不妨擺脫它。使用時間戳作爲範圍字段並沒有什麼幫助,因爲任何密鑰都可能陳舊,所以我們不得不還原爲'scan'! – 2012-02-19 01:03:08

+1

是的,我不認爲你正在尋找自動過期功能,所以你所做的任何事情都必須作爲批處理工作來完成。最簡單的方法是按日期對錶格進行分區,或根據需要進行清理。 – Nick 2012-02-19 12:30:06

5

你可以做懶期滿並根據請求刪除它。

例如:

  • 存儲密鑰 「a」 與屬性 「過期」,到期10分鐘。
  • 在9分鐘內取回,檢查過期,將其退回。
  • 在11分鐘內取閱。檢查過期。因爲它比現在少,請刪除條目。

這是幾年前我在查看源代碼時正在做的事。

您仍然需要執行掃描以刪除所有舊條目。

你也可以考慮使用彈性緩存,這意味着緩存而不是永久數據存儲。

7

我也像使用Redis一樣使用DynamoDB。

我的建議是將密鑰寫入不同的時間片表

例如,假設一個類型的記錄應最多持續幾分鐘,少一個小時,那麼你可以

  1. 創建新表每天爲這種類型的記錄,並在今天的表存儲新記錄。
  2. 當您讀取記錄時使用讀取維修技巧,這意味着如果您無法在今天的表格中找到記錄,那麼您可以嘗試在昨天的表格中找到它,並在必要時放入今天的表格中。
  3. 如果您在任一表格中找到記錄,請使用它的時間戳進行驗證。此時不需要刪除過期的記錄。
  4. 刪除您的任務中的整個陳舊錶。

這樣更容易維護和經濟高效。