2012-01-13 22 views
8

Mam aplikację szyny, ponieważ używam zwykłej pamięci podręcznej rails. Moje badania jest następujący:Pamięć podręczna railsów wygasa

Rails.cache.write('temp',Date.today,:expires_in => 60.seconds) 

mogę go odczytać przez Rails.cache.read('temp') i Rails.cache.fetch('temp').

Problem polega na tym, że nie wygasa. Będzie nadal żył po 60 sekundach. Czy ktoś może mi powiedzieć, czego tu brakuje?

FYI: I zadeklarowały w moim development.rb następująco:

config.action_controller.perform_caching = true 

config.cache_store = :memory_store 

Czy coś przegapiłem? Chcę wygasić pamięć podręczną.

Odpowiedz

9

Po pewnym wyszukiwaniu znalazłem jeden możliwy powód, dla którego pamięć podręczna nie została wyczyszczona po 60 sekundach.

  1. Zadzwoń pod numer Rails.cache.write, który jest udokumentowany here.
  2. Wywołuje write_entry(namespaced_key(name, options), entry, options), gdzie opcja :expires_in jest jedną z części argumentu options.
  3. implementation of write_entry ma następujący warunek:

    if expires_in > 0 && !options[:raw] 
        # Set the memcache expire a few minutes in the future to support race condition ttls on read 
        expires_in += 5.minutes 
    end 
    

więc istnieje 5 minut dodawane do 60 sekund. 2 możliwe rozwiązania:

  • prostu żyć z nim :-)
  • spróbować dołączyć opcję :raw => true, być może będzie to pominąć stan, tak, że wygaśnięcie działa jako podejrzane.
+0

Dzięki za powtórki .... pozwól mi spróbować i poinformować – palani

+0

Tak mliebelt rację, również dobry szyny cache doc można znaleźć tutaj http://guides.rubyonrails.org/caching_with_rails.html –

5

Opcja :expires_in działa tylko w zgodnych sklepach (np. Memcached) - nie w pamięci.

Od http://guides.rubyonrails.org/caching_with_rails.html:

Wreszcie, jeśli używasz memcached lub ehcache, można również przejść : expires_in. W rzeczywistości wszystkie parametry, które nie są używane przez pamięć podręczną, są wysyłane do bazowego magazynu pamięci podręcznej .

Powiązane problemy