2010-07-13 59 views
1

我不確定這是否可能。我在一個memcache服務器中存儲了一些信息。我存儲的memcache條目被假設爲30分鐘到期。在那30分鐘內,我可以通過同一個密鑰更新該內存緩存條目引用的值。但是,當我更新的價值,我不想改變過期時間。例如:PHP Memcache密鑰到期

  • 鑰匙創建並設置在30分鐘內
  • 10分鐘,過期的推移和被請求的關鍵字的價值,我們更改值
  • 我更換使用它們鍵的值memcache替換(我不提供新的過期時間,因爲它是可選的),我希望過期時間爲30-10 = 20,因爲密鑰是在10分鐘前創建的,並且設置爲在30分鐘內過期。
  • 現在,因爲我沒有設置過期時間,所以它默認爲0,並且密鑰永不過期。

現在,有沒有設置在內存緩存中的項目,設定到期時間,然後獲取/更換項目,同時保持了到期時間x分鐘後,我設置緩存中的項目的方式?

我可能可以使用unix時間戳而不是秒設置到memcache中時過期,也可以將該時間戳存儲在memcache中,當我將其設置回memcache時,我只需將其設置爲存儲在同一個時間戳中值。或者有更好的方法來做到這一點?

順便說一句,使用memcache而不是memcached。

回答

1

本質上,Memcache確實做到了你想要的。它很好地完成了工作,獲得並設置了值......我認爲您尋找的答案超出了memcache的默認功能。我想你可以把更多的控制權放在你的代碼庫上來檢查你存儲在blob中的時間戳,並使用它來設置未來更新的過期時間?

我不知道你的非memcache一致存儲使用了什麼,但我會在此存儲一個失效日期 - 然後使用該值更新你的memcache。

+0

是的,我只是要在memecache中存儲到期的時間戳,所以我可以設置到期價值,當我更換價值。 我不想使用其他類型的存儲(如sql db或nosql db)只是過期。我可以在memcache中完成所有操作,只需通過一些簡單的操作即可。 但你是對的,memecache做它應該做的。 謝謝! – gprime 2010-07-13 18:13:52

3

我知道這個問題已經過時了,但我認爲我應該對gprime的解決方案加以警告。

這聽起來像gprime的「小丑醜」是將過期作爲一個單獨的值存儲在內存緩存中。問題是,memcache最終可能會在需要時清除過期值。即使分配給memcached的內存不足,也會發生這種情況。

(進一步解釋見http://sparklewise.com/?p=506

這可能是一個問題,如果你的代碼不佔可能性先前存儲的到期不見了。即使你這樣做了,你最終可能會在高速緩存中的值超過預期。

在99.999%的情況下,這可能不是什麼大問題,但這是一個棘手的問題,當它發生時會引起大量的頭髮拉傷和頭部劃傷。希望這篇文章能幫助別人避免這種痛苦。 :-)