Archive for August, 2009
Hrajeme si s CACHE v Ruby on Rails
by petrb on Aug.04, 2009, under Optimalizace, Ruby on Rails, cache
CO JE TO CACHE (keš)?
Keš jako takovou si můžeme představit jako složku se statickými html soubory, které byly po prvním načtení stránek vygenerovány. Jakmile někdo druhý bude chtít zobrazit stejnou stránku, tak už nebudou posílány dotazy na server, ale stránka bude vytažena z keše. Tím se zaprvé sníží vytížení serveru a za druhé načtení stránky bude taky nesrovnatelně rychlejší. Soubory jsou ukládány do tmp složky ve vaší aplikaci.
KONFIGURACE
Proto aby jste si mohli začít hrát s keší, není potřeba vůbec nic složitého. Je potřeba, nastavit v config/environments/development.rb
config.action_controller.perform_caching = true
Defaultně je tato možnost nastavena na false, protože při vývoji aplikace se tato možnost nepokládá za prospěšnou. :) V production módu není nic potřeba nastavovat, je to tam již nastaveno.
POTŘEBUJI CACHE?
Používání keše se doporučuje všude tam kde je to jen možné v co možná největší míře. Níže uvádím příklady kdy je kešování vhodné.
- stránky se nemění (resp. jsou pro všechny uživ. stejné)
- stránky jsou dostupné pro veřejnost (není potřeba autentifikace)
Druhá podmínka je podstatná, ale i ta se dá obejít použití javascriptu, ale na druhou stranu se zase snižuje přístupnost webu, protože přihlášení uživ. je podmíněno zaplým javascriptem. V tomto článku se ale tomuto tématu věnovat nebudeme. (Někdy přístě můžeme nakousnout i toto téma)
PAGE CACHE
Představme si, že vytváříme jednoduchou aplikaci (např. knihovna). Úvodní stránka může vypadat nějak následovně.
- class BooksController < ApplicationController - def index - @knihy = Book.find(:all, :order => "created_at DESC", :limit => 10) - end - end
Na indexové stránce se nám vybere 10 nejaktuálnějších knih. Pokud budeme chtít trošku věci urychlit, tak můžeme použít page kešing. Na začátek controlleru jen specifikujeme, který action blok budeme chtít kešovat, pomocí direktivy “caches_page”.
- class BooksController < ApplicationController - caches_page :index - def index - @knihy = Book.find(:all, :order => "created_at DESC", :limit => 10) - end - end
Tak a teď se nám podařilo zdárně zakešovat indexovou stránku. Další krok, který bude následovat je smazání vytvořené keše (resp. zrušíme platnost keše). Keš budeme chtít smazat když přidáme např. nový článek, nebo když stávající editujeme. Kdyby jsme keš nesmazali, tak by se nám změny na úvodní stránce neprojevily a stále by se nám načítal starý zakešovaný obsah.
- expire_page(:controller => ‘books’, :action => ‘index’)
Problém může nastat, pokud bysme zakešovali specifickou stránku např. “/books/show/15″ a pak chtěli zrušit tuto keš. Řešením je použití :id, kde specifikujeme o jaký článek se bude jednat. :)
- expire_page(:controller => ‘books’, :action => ‘show’, :id => 15)
Další možností jak vymazat cache je použití tzv. sweeper-ů. Použití je taktéž velmi intuitivní a jednoduché. Nesmíme však opomenout daný sweeper v controlleru specifikovat.
- class BooksController < ApplicationController - caches_page :index - #sweeper budeme aplikovat jen na následující metody - cache_sweeper :book_sweeper, :only => [:create, :update, :destroy] - def index - @knihy = Book.find(:all, :order => "created_at DESC") - end - end
vytvoříme book_sweeper.rb, který umístíme do naší “/model” složky.
- class BookSweeper < ActionController::Caching:Sweeper - #zde definujeme, který model chceme pozorovat - observe Book - def after_create(record) - expire_page(:controller => "books", :action => "show", :id => "15") - end - def after_update(record) - ... - end - def after_destroy(record) - ... - end - end
V další části se podíváme na action cache a fragment cache. ;)
Dotazy, poznámky, připomínky jsou vítány.
Petr Bobek