Rails3 i wygasający cache
Opublikowane przez Jarosław Zabiełło
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ż:


