2012-05-24 48 views
0

我爲每個API調用都有一個非常廣泛的緩存系統。每個命令和請求參數以及特定的超時都會創建唯一的指紋。緩存設計和Memcache(d)超時記錄?

當發出請求並且未分配可接受的高速緩存時間戳時,請求將不會返回緩存,因此程序會自行完成所有操作。結果存儲在高速緩存中,並帶有新的時間戳。

如果發出請求並且請求定義它願意接受5分鐘緩存 - 並且系統發現這種情況 - 則系統返回緩存結果。

這意味着我的每個緩存記錄都包含一個密鑰(唯一指紋),結果和時間戳以表示它的製作時間。

當前緩存存儲在文件系統中,時間戳是文件修改時間,這會導致I/O請求在較高負載上成爲殺手。

閱讀了多篇文章後,我意識到Memcache和Memcached被推薦用於減少這些調用。

但Memcache和Memcached只存儲指紋和值。沒有時間戳,這在技術上意味着我將失去按需緩存時間戳接受度和靈活性。我在技術上有開始存儲兩個記錄每個緩存:

指紋數據和數據 指紋時間和時間戳

..這似乎很髒。有沒有其他的選擇?

回答

1

如果您在創建時知道您的緩存對象應該在緩存中保留多久,那麼Memcached具有您需要的功能。 Memcache::set函數具有一個名爲$expire的參數,您可以在其中設置緩存對象的生存期(以秒爲單位)。

如果您只知道從緩存中檢索對象時的生命週期,這將無法工作。 我同意每個緩存實體使用兩個密鑰是不可行的,因爲緩存可能會丟失其中一個而保留另一個。 A(仍然「髒」,但更好)的解決方案可能是存儲每個放入緩存的對象的時間戳。你可以通過不直接緩存對象來做到這一點,而是包含時間戳和對象的數組。

+0

我的問題是我的緩存是'按需'。也就是說,我可以創建一個API請求並接受最新的X秒量的緩存,或接受來自其他地方的另一個API請求 - 完全相同的命令 - 接受緩存的Y秒數不同。例如,有些數據只對登錄的用戶更加「新鮮」(減少導致大量緊張的平均訪問量)。由於控制器是相同的,並且API請求是相同的,唯一不同的是接受緩存持續時間。遺憾的是,當涉及到按需緩存時,Expires標誌不能幫助我。 – kingmaple