Cache w Ruby on Rails
Czasami tworząc aplikacje internetowe, wymagające dużej wydajności, okazuje się, że wykonywanie jakiegoś kodu od nowa dla każdego odwiedzającego jest nieekonomiczne. Można temu zaradzić umieszczając taki kod w cache (pliku, pamięci ram, bazie danych).
W RoR istnieją trzy tryby buforowania zawartości:
- Buforowanie całej strony — page cachcing
- Buforowanie akcji — action caching
- Buforowanie fragmentów — fragments caching
Page caching
Buforowanie strony polega na dodaniu do swojego kontrolera filtra caches_page, w najprostszym wypadku wygląda to tak:
class MainController < ApplicationController
caches_page :index, :about
end
Strony index i about zostaną umieszczone w buforze, i z tamtąd będą serwowane użytkownikom.
Tam metoda jest bardzo prosta, lecz jeśli masz na niej jakieś elementy np. zależne od użytkownika, to niestety musisz z niej zrezygnować.
Action caching
Ta metoda keszowania, nie różni sie znacząco od poprzedniej. Do bufora ładowany jest wynik przetwarzania akcji, a szablon jest przetwarzany za każdym razem, więc możemy serwować treść cachowaną i dynamiczną na raz.
caches_action :akcja1, :akcja2
Fragment caching
Jeśli nasza aplikacja używa nie tylko contentu bazującego na URLach (np. związanego z sesjami), musimy użyć trzeciego sposobu buforowania danych. Ten sposób ma jedną zaletę — jest bardzo elastyczny, możemy precyzyjnie zaznaczyć co chcemy buforować, a czego nie, za pomocą znaczników szablonów:
# non-buffered content
< % cache( :action => 'show_post',:id => @post_id) do %>
# buffered content
< % end %>
# non-buffered content
Tak informujemy framework, że wersja skeszowana jest już niepotrzebna (dotyczy wszystkich trybów cachcingu):
expire_page :controller => 'blog', :action => 'show_post', :id => post_id
Sweeper
Sweeper jest to kod, odpowiedzialny za automatyczne czyszczenie bufora.
class BlogSweeper < ActionController::Caching::Sweeper #klasa sweepera
observe Blog #Będziemy obserwować kontroler Blog
#jeśli stworzymy posta, usuń cache
def after_create(post)
expire_cache_for(post)
end
# jeśli zmodyfikujemy posta, usuń cache
def after_update(post)
expire_cache_for(post)
end
# ... i to samo jeśli usuniemy
def after_destroy(post)
expire_cache_for(post)
end
private
def expire_cache_for(record)
expire_page(:controller => 'blog', :action => 'show_post', :id => record.id)
expire_page(:controller => 'blog', :action => 'show_posts')
end
end
I teraz aby używać naszej klasy dodamy filtr:
cache_sweeper :blog_sweeper, :only => [:create, :update, :destroy]
Na koniec
Po więcej informacji odsyłam do dokumentacji RoR: fragment caching, action caching, page caching, sweeping
Polecam jeszce przejrzenie tego postu, który pokazuje inne podejscie do buforowania w Rubym: Jarmark.org — Wygodny Cache
No related posts.
Powiązane wpisy wygenerowane przez wtyczkę Yet Another Related Posts.