2013-01-18 51 views
13

我做了一些谷歌搜索,找不到這個問題的答案。 Rails允許爲其緩存一樣,指定到期時間:Rails緩存的默認失效時間是多少?

Rails.cache.fetch("my_var", :expires_in => 10.seconds) 

但是,如果我沒有指定,會發生什麼:

Rails.cache.fetch("my_var") 

它不會過期?有默認值嗎?我如何明確定義永不過期的東西?

+0

設置期滿的'fetch'不除非給出塊,否則不起作用 –

回答

11

這實際上取決於您正在使用哪種緩存存儲。 Rails提供了幾種,其中最受歡迎的是Memcached。 Memcached的主要功能之一是它automatically expires old unused records,所以你可以忘記:expire選項。

其他Rails緩存存儲,如內存存儲或redis存儲將保持不會過期日期,除非您明確指定何時執行此操作。

More about how cache key expiration works in Rails.

+1

我使用:expires_in作爲一種意義來定義我認爲數據需要多長時間。如果我認爲可以使用5分鐘的舊數據,我使用expires_in:5分鐘。我的緩存的主要原因是加速併發和錘擊。 –

+0

@OskarHolmkratz一個有用的替代方法是使用反映版本的緩存鍵(這就是爲什麼ActiveRecord具有基於updated_at時間戳的.cache_key屬性的原因)。那麼你不必擔心過期,你會顯示最新的結果,舊的數據將自動清除。 – mahemoff

5

他們永不過期。 (對於基於FileStore的緩存,這是Rails中的默認緩存)

如果在高速緩存存儲中找到它們的密鑰,則會使用該值。因此,建議至少添加任何到期時間。

+6

這似乎是邏輯,但你有什麼參考?我一直在尋找很多東西,我無法找到它。此外,我的系統的行爲就像是有一個默認的失效時間,我想排除由於一些緩存隱藏默認值的可能性。另外,這不會依賴底層緩存存儲嗎? – joscas

8

使用達利memcached的(誰不),默認的到期時間是永遠,因爲@Rahul說。您不必擔心垃圾收集,因爲@icem說,memcached會拋出舊的未使用的記錄。

看到官方達利文檔:

Expires_in default is 0, which means never 

https://github.com/mperham/dalli#configuration

你可以設置全局過期時間爲達利

config.cache_store = :dalli_store, { expires_in: 1.day} 

和更好的單獨控制:

Rails.cache.write "some_cache_key", some_cachable_string, expires_in: 3.hours 

新文檔中http://apidock.com/rails/ActiveSupport/Cache/Store/write沒有說太多,但老的作用: http://apidock.com/rails/ActiveSupport/Cache/MemCacheStore/write

手動到期緩存(如果發生的一些事件):

Rails.cache.delete "some_cache_key" 
相關問題