ESTRATÉGIASDE CACHE PARA TUNAR SUA APLICAÇÃO RAILS
CIRDES HENRIQUEENGENHEIRO DA COMPUTAÇÃO - UFPE ORGANIZADOR DO ABRIL PRO RUBY C0-FUNDADOR E DEV DO EVENTICK
335 MIL TICKETS EMITIDOS 3600 ORGANIZADORES
1200 EVENTOS FUTUROS
RECIFE
RECIFE
O EVENTICK FICOU
FORA DO AR POR 30 MINUTOS
ANTES DA SOLUÇÃO, UM PASSO ATRÁS:MONITORAR A APLICAÇÃO
NewRelic Nazar.io
HoneyBadger Logentries Inspectlet
The Informant
SOA?
SINGLE RAILS APP LIKE SHOPIFY
70% DAS REQUISIÇÕES BATEM NA CACHE
O QUE É CACHE?
Cache é um componente que guarda informações de forma TRANSPARENTE
para que futuras requisições
sejam mais RÁPIDAS
QUAL ACARACTERÍSTICA
DA CACHE?
O QUE USA CACHE?
DO QUE É CONSTITUÍDA UMA CACHE?
CACHE = CASH
ARQUITETURA DE MEMÓRIA
CACHE HIT / CACHE MISS / CACHE RATIO
COMO MAXIMIZAR O CACHE HIT?
BÉLÁDY’S ALGORITHM
RANDOMREPLACEMENT
(RR)
LEAST-FREQUENTLY USED(LFU)
LEAST-RECENTLY USED(LRU)
O QUE É WEBCACHING?
REQUISIÇÃO
Rails App
Reverse Proxy
CDN Proxy
Browser
CACHE SERVER-SIDE
CACHE CLIENT-SIDE
PAGE CACHE
ACTIONCACHE
FRAGMENTCACHE
RAILSCACHE
WRITE ON DISK
BYPASS RAILS APPLICATION ENTIRE
STATELESS PAGES
NÃO FUNCIONA NO HEROKU
PAGE CACHE
PAGE CACHE
class WeblogController < ActionController::Base caches_page :show, :new def update expire_page action: 'show', id: params[:list][:id] end end
SIMILAR TO PAGE CACHE
RUN FILTERS
ACTION CACHE
ACTION CACHE
class PostsController < ActionController::Base caches_action :show, expires_in: 1.hour end
DEPRECATED
HTML CACHE AVAILABLE IN RAILS 4
FRAGMENT CACHE
RAILS CACHE
FRAGMENT AND ACTION CACHE BUILD ON RAILS.CACHECONFIG.ACTION_CONTROLLER.PERFORM_CACHING = TRUE
ActiveSupport::Cache::Store
FileStore MemoryStore
NullStore MemCacheStore
HOW TO USE IT
Rails.cache.write 'foo', 'bar' Rails.cache.fetch 'foo' Rails.cache.write :foo, {a: 'b'}
FRAGMENT CACHING
Rais.cache.fetch 'key', expires_in: 5.minutes, race_condition_ttl: 10.seconds do #code end
FRAGMENT CACHING
<% cache "event-#{event.id}" do %><%= render event %>
<% end %>
FRAGMENT CACHING
<% cache “event-#{event.id}”, expires_in: 1.year do %><%= render event %>
<% end %>
FRAGMENT CACHING
def update expire_fragment("event-#{event.id}")end
FRAGMENT CACHING
<% cache [:recent, event] do %><%= render event %>
<% end %>
FRAGMENT CACHING
ACTIVESUPPORT::CACHE.EXPAND_CACHE_KEY [:RECENT, EVENT] => "RECENT/EVENTS/12510-20141128131506743910000"
FRAGMENT CACHING
<% cache :recent_attendees, expires_in: 5.minutes do %><%= render partial: 'recent',
collection: Attendees.recent %><% end %>
FRAGMENT CACHING
<% cache(cache_key_for_attendees) do %><%= render partial: 'recent', collection:Attendees.recent %>
<% end %>
FRAGMENT CACHING
module AttendeesHelper def cache_key_for_attendees count = Attendee.count max_updated_at = Attendee.maximum(:updated_at).try(:utc).try(:to_s, :number) "attendees/all-#{count}-#{max_updated_at}" end end
FRAGMENT CACHING
<% cache(cache_key_for_attendees) do %><%= render partial: 'recent', collection:Attendees.recent %>
<% end %>
PROBLEMA COM TEMPLATE
CACHE Digests
<!-- app/views/events/show.html.erb --><% cache ["v1", @event] do%>
<h1>Team: <%= @event.title %></h1>
<%= render @event.attendees %><% end %>
<!-- app/views/attendees/_attendee.html.erb --><% cache ["v1", attendee] do %>
<span><%= attendee.name %></span><span><%= attendee.email %></span>
<% end %>
CACHE Digests
����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ VIEWS/V1/ATTENDEES/1-20121220141922����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ VIEWS/V1/ATTENDEES/2-20121220141922����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ VIEWS/V1/EVENTS/2-20121220141922����������� ������������������
CACHE Digests
����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ VIEWS/ATTENDEES/1-20121220141922/74865FCB3E2752A0928FA4F89B3E4426����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ VIEWS/ATTENDEES/2-20121220141922/74865FCB3E2752A0928FA4F89B3E4426����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ VIEWS/EVENTS/2-20121220141922/4277F85C137009873C093088EF609E60����������� ������������������
RUSSIAN DOLL
Russian Doll
Russian Doll
<% cache(cache_key_for_attendees) do %>All available attendees:<% Attendee.all.each do |a| %><% cache(a) do %><p><%= a.name %></p>
<% end %><% end %>
<% end %>
KNOWING ISNOT ENOUGH WE MUST APPLY
WILLING ISNOT ENOUGH WE MUST DO
Top Related