Mechanizm cachowania w RoR

Cache w Ruby on Rails

Cza­sami tworząc aplikacje inter­ne­towe, wyma­ga­jące dużej wyda­jności, okazuje się, że wykony­wanie jakiegoś kodu od nowa dla każdego odwiedza­jącego jest nieeko­nom­iczne. Można temu zaradzić umieszcza­jąc taki kod w cache (pliku, pamięci ram, bazie danych).

W RoR ist­nieją trzy tryby buforowa­nia zawartości:

  1. Buforowanie całej strony — page cachcing
  2. Buforowanie akcji — action caching
  3. Buforowanie frag­men­tów — frag­ments caching

Page caching

Buforowanie strony polega na doda­niu do swo­jego kon­trol­era fil­tra caches_page, w najprost­szym wypadku wygląda to tak:

class MainController < ApplicationController
  caches_page :index, :about
end

Strony index i about zostaną umieszc­zone w buforze, i z tamtąd będą ser­wowane użytkown­ikom.
Tam metoda jest bardzo prosta, lecz jeśli masz na niej jakieś ele­menty np. zależne od użytkown­ika, to niestety musisz z niej zrezygnować.

Action caching

Ta metoda keszowa­nia, nie różni sie znacząco od poprzed­niej. Do bufora ładowany jest wynik przetwarza­nia akcji, a szablon jest przetwarzany za każdym razem, więc możemy ser­wować treść cachowaną i dynam­iczną na raz.

caches_action :akcja1, :akcja2

Frag­ment caching

Jeśli nasza aplikacja używa nie tylko con­tentu bazu­jącego na URLach (np. związanego z ses­jami), musimy użyć trze­ciego sposobu buforowa­nia danych. Ten sposób ma jedną zaletę — jest bardzo elasty­czny, możemy pre­cyzyjnie zaz­naczyć 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 infor­mu­jemy frame­work, że wer­sja skeszowana jest już niepotrzebna (doty­czy wszys­t­kich try­bów cachcingu):

expire_page :controller => 'blog', :action => 'show_post', :id => post_id

Sweeper

Sweeper jest to kod, odpowiedzialny za automaty­czne czyszcze­nie 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ży­wać naszej klasy dodamy filtr:

cache_sweeper :blog_sweeper, :only => [:create, :update, :destroy]

Na koniec

Po więcej infor­ma­cji odsyłam do doku­men­tacji RoR: frag­ment caching, action caching, page caching, sweep­ing

Pole­cam jeszce prze­jrze­nie tego postu, który pokazuje inne pode­j­scie do buforowa­nia w Rubym: Jarmark.org — Wygodny Cache

No related posts.

Pow­iązane wpisy wygen­erowane przez wty­czkę Yet Another Related Posts.

Ten wpis został opublikowany w kategorii Programowanie. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>