<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ruby on Rails &#187; cache</title>
	<atom:link href="http://petrbobek.cz/clanky/category/ruby-on-rails/optimalizace/cache/feed/" rel="self" type="application/rss+xml" />
	<link>http://petrbobek.cz</link>
	<description>Just like RORck</description>
	<lastBuildDate>Sat, 10 Oct 2009 15:59:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hrajeme si s CACHE v Ruby on Rails</title>
		<link>http://petrbobek.cz/clanky/hrajeme-si-s-cache-v-ruby-on-rails/</link>
		<comments>http://petrbobek.cz/clanky/hrajeme-si-s-cache-v-ruby-on-rails/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 21:04:51 +0000</pubDate>
		<dc:creator>petrb</dc:creator>
				<category><![CDATA[Optimalizace]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache sweeper]]></category>
		<category><![CDATA[page cache]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://petrbobek.cz/?p=1</guid>
		<description><![CDATA[V tomto dílu se dozvíte jak se pracuje s keší. Jak a při jakých příležitostech ji efektivně využívat. PAGE CACHING, ACTION CACHING, FRAGMENT CACHING]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #ff6600;">CO JE TO CACHE (keš)?</span></strong></p>
<p>Keš jako takovou si můžeme představit jako složku se <span style="text-decoration: underline;">statickými html soubory</span>, 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 <span style="text-decoration: underline;">vytažena z  keše</span>. Tím se zaprvé <span style="text-decoration: underline;">sníží vytížení serveru</span> a za druhé načtení stránky bude taky nesrovnatelně <span style="text-decoration: underline;">rychlejší</span>. Soubory jsou ukládány do <span style="text-decoration: underline;">tmp</span> složky ve vaší aplikaci.</p>
<p><strong><span style="color: #ff6600;">KONFIGURACE</span></strong></p>
<p>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 <span style="line-height: 18px; font-size: 12px; white-space: pre;"><span style="color: #3366ff;">config/environments/development.rb</span></span></p>
<pre class="brush: ruby;">config.action_controller.perform_caching = true</pre>
<p>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.</p>
<p><strong><span style="color: #ff6600;">POTŘEBUJI CACHE?</span></strong></p>
<p>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é.</p>
<ul>
<li>stránky se nemění (resp. jsou pro všechny uživ. stejné)</li>
<li>stránky jsou dostupné pro veřejnost (není potřeba autentifikace)</li>
</ul>
<p>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)</p>
<p><span style="color: #ff6600;"><strong>PAGE CACHE</strong></span></p>
<p>Představme si, že vytváříme jednoduchou aplikaci (např. knihovna). Úvodní stránka může vypadat nějak následovně.</p>
<pre class="brush: ruby;">- class BooksController &lt; ApplicationController
-    def index
-        @knihy = Book.find(:all, :order =&gt; &quot;created_at DESC&quot;, :limit =&gt; 10)
-    end
- end</pre>
<p>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 &#8220;caches_page&#8221;.</p>
<pre class="brush: ruby;">- class BooksController &lt; ApplicationController
-    caches_page :index
-    def index
-        @knihy = Book.find(:all, :order =&gt; &quot;created_at DESC&quot;, :limit =&gt; 10)
-    end
- end</pre>
<p>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.</p>
<pre class="brush: ruby;">- expire_page(:controller =&gt; ‘books’, :action =&gt; ‘index’)</pre>
<p>Problém může nastat, pokud bysme zakešovali specifickou stránku např. &#8220;/books/show/15&#8243; a pak chtěli zrušit tuto keš. Řešením je použití :id, kde specifikujeme o jaký článek se bude jednat. :)</p>
<pre class="brush: ruby;">- expire_page(:controller =&gt; ‘books’, :action =&gt; ‘show’, :id =&gt; 15)</pre>
<p>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.</p>
<pre class="brush: ruby;">- class BooksController &lt; ApplicationController
-    caches_page :index
-    #sweeper budeme aplikovat jen na následující metody
-    cache_sweeper :book_sweeper, :only =&gt; [:create, :update, :destroy]

-    def index
-        @knihy = Book.find(:all, :order =&gt; &quot;created_at DESC&quot;)
-    end
- end</pre>
<p>vytvoříme book_sweeper.rb, který umístíme do naší &#8220;/model&#8221; složky.</p>
<pre class="brush: ruby;">- class BookSweeper &lt; ActionController::Caching:Sweeper
-    #zde definujeme, který model chceme pozorovat
-    observe Book

-    def after_create(record)
-        expire_page(:controller =&gt; &quot;books&quot;, :action =&gt; &quot;show&quot;, :id =&gt; &quot;15&quot;)
-    end
-    def after_update(record)
-        ...
-    end
-    def after_destroy(record)
-        ...
-    end
- end</pre>
<p>V další části se podíváme na action cache a fragment cache. ;)<br />
Dotazy, poznámky, připomínky jsou vítány.</p>
<p>Petr Bobek</p>
]]></content:encoded>
			<wfw:commentRss>http://petrbobek.cz/clanky/hrajeme-si-s-cache-v-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
