2013-01-18 14 views
13

Zrobiłem trochę googlowania i nie mogłem znaleźć odpowiedzi na to pytanie. Szyny pozwala określić czas wygaśnięcia pamięci podręcznej tak:Jaki jest domyślny czas wygaśnięcia pamięci podręcznej Rails?

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

Ale co się stanie, jeśli nic określić:

Rails.cache.fetch("my_var") 

Nigdy nie wygasa? Czy istnieje wartość domyślna? Jak mogę jednoznacznie zdefiniować coś, co nigdy nie wygasa?

+0

ustawienie wygaśnięcie na 'fetch' nie mieć jakikolwiek efekt, chyba że zostanie podany blok –

Odpowiedz

11

To naprawdę zależy od tego, którego magazynu pamięci podręcznej używasz. Railsy oferują kilka, jeden z nich najbardziej popularny to Memcached. Jedną z kluczowych cech Memcached jest to, że jest to automatically expires old unused records, dzięki czemu możesz zapomnieć o opcji: wygaśnięcia.

Inne pamięci podręczne pamięci Rails, takie jak pamięć lub pamięć podręczna, nie będą tracić ważności, chyba że wyraźnie określisz, kiedy to zrobić.

More about how cache key expiration works in Rails.

+1

Używam: expires_in jako środek do definiowania, jak nowe dane powinny być. Jeśli uważam, że wszystko jest w porządku z 5-minutowymi danymi, używam expires_in: 5.minutes. Moim głównym powodem buforowania jest przyspieszenie działania w celu uzyskania współbieżności i uderzeń. –

+0

@OskarHolmkratz Przydatną alternatywą może być użycie klucza pamięci podręcznej, który odzwierciedla wersję (dlatego ActiveRecord ma atrybut .cache_key, który jest oparty na updated_at timestamp). Wtedy nie musisz już martwić się o wygaśnięcie, będziesz pokazywał ostatni wynik, a stare dane będą automatycznie usuwane. – mahemoff

5

Nigdy nie wygasają. (dla pamięci podręcznej opartej na FileStore, domyślnej w Railsach)

Jeśli klucz zostanie znaleziony w pamięci podręcznej, zostanie użyta wartość. Dlatego zawsze zaleca się dodanie co najmniej czasu wygaśnięcia.

+6

To wydaje się logiczne, ale czy masz jakieś odniesienia do tego? Wiele szukałem i nigdzie nie mogę tego znaleźć. Poza tym mój system zachowuje się tak, jakby istniał domyślny czas wygaśnięcia i chciałbym wykluczyć możliwość bycia z powodu ukrytej domyślnej wartości ukrytej pamięci podręcznej. Czy nie byłoby to zależne od podstawowego magazynu pamięci podręcznej? – joscas

8

Korzystanie Dalli dla memcached (który nie robi), domyślny czas wygaśnięcia nie jest, jak mówi @Rahul. Nie musisz się martwić o zbieranie śmieci, jak mówi @icem, memcached wyrzuć stare nieużywane rekordy.

Zobacz oficjalną dokumentację Dalli:

Expires_in default is 0, which means never 

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

można ustawić czas ważności globalnego dla Dalli

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

i dla lepszej kontroli indywidualnej:

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

nowy doc http://apidock.com/rails/ActiveSupport/Cache/Store/write nie mówi dużo, ale stara robi: http://apidock.com/rails/ActiveSupport/Cache/MemCacheStore/write

ręcznie wygaśnie cache (jeśli wystąpił jakiś event):

Rails.cache.delete "some_cache_key" 
Powiązane problemy