Rails3 i wygasający cache

Opublikowane przez Jarosław Zabiełło Fri, 02 Jul 2010 20:37:00 GMT

Standardowa obsługa cache’a w Rails 2.x (trzymająca buforowane dane w plikach) pozbawiona jest automatycznego odświeżania buforowanych treści po zadanym okresie czasu. Co prawda Rails dostarcza bogaty zestaw warunków które są w stanie wyzwolić “sweepera” (metodę regenerującą wybrany fragment cache’a), ale regenerowanie cache’a możliwe jest tylko na żądanie. I aby to zmienić, w Rails 2.x konieczne jest użycie Memcached jako domyślnego backendu dla systemu cache’owania.

W Rails 3 ulepszono, ujednolicono strategię cache’a. Domyślny backend ActiveSupport::Cache::FileStore ma dostęp do funkcji dostępnych wcześniej dla ActiveSupport::Cache::MemCacheStore.

  • Rails.cache.read
  • Rails.cache.write
  • Rails.cache.fetch
  • Rails.cache.delete
  • Rails.cache.exist?
  • Rails.cache.increment
  • Rails.cache.decrement
  • Rails.cache.clear

Np. zawartość poniższego fragmentu szablonu zostanie odświeżona po upływie 10 sekund mimo, że nie użyto Memcached:

<% cache :now, :expires_in => 10.seconds do %>
  <% = Time.now %>
<% end %>

Inne przykłady:

$ rails c
>> Rails.cache.read :welcome
 => "Hello World!" 
>> Rails.cache.exist? :welcome
 => true 
>> Rails.cache.delete :welcome
 => true 
>> Rails.cache.delete :welcome
 => nil 
>> Rails.cache.exist? :welcome
 => false 
>> Rails.cache.read :welcome
=> nil 
>> Rails.cache.write :licznik, 0
 => true 
>> Rails.cache.increment :licznik
 => 1 
>> Rails.cache.increment :licznik
 => 2 
>> Rails.cache.read :licznik
  => 2 
>> Rails.cache.decrement :licznik
  => 1 
>> Rails.cache.decrement :licznik
  => 0 
>> Rails.cache.decrement :licznik
  => -1 
>> Rails.cache.fetch(:time, :expires_in => 5.seconds) { Time.now }
   => 2010-07-02 21:15:29 +0100 
>> Rails.cache.fetch(:time, :expires_in => 5.seconds) { Time.now }
   => 2010-07-02 21:15:29 +0100 
>> Rails.cache.fetch(:time, :expires_in => 5.seconds) { Time.now }
   => 2010-07-02 21:15:35 +0100 

Jak można zobaczyć, plik ze wygasłym cachem jest automatycznie kasowany podczas próby jego odczytu po zadanym czasie:

$ rails c
>> Rails.cache.write :msg, 'hello', :expires_in => 10.seconds
 => true

$ ls -lR tmp/cache

cache/148/970:
total 8
-rw-r--r--  1 zbiru  staff  121  2 Jul 23:01 msg

$ rails c
>> Rails.cache.read :msg 
 => nil

$ ls -lR tmp/cache

cache/148/970:

Zobacz też:

Tagi , , , , ,  | brak comments

Comments

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz