@MQuy
Full Stack Web Developer at RingMD
Topic: Caching on Rails
Why Using Caching?
- 
        
Your app becomes faster for the users.
 - 
        
The cost is lower than non-caching system.
 
Caching Strategies
- 
            
HTTP Caching
 - 
            
Page Caching
 - 
            
Fragment Caching
 - 
            
Low-level Caching
 
1. HTTP Caching

1. Http Caching
class HomeController < ApplicationController
  def index
    @schedules = Schedule.all
    if stale? @schedules
      respond_to do |format|
        format.html
      end
    end
  end
end

2. Page Caching
     2. Page Caching
class HomeController < ApplicationController
  caches_page :about
  
  def about; end
end

- Url query params will be ignored
 
/feedback?search=hello => /feedback
3. Fragment Caching
 3. Fragment Caching

3. Fragment Caching
class BlogController < ApplicationController
  def index
    @articles = Article.publish
  end
end
%h2 Blog
.grid_11
  - cache @articles do
    - @articles do |article|
      %article
        .date
          .month= article.month
          .year= article.year
        %div
          .title= article.title
          .content= article.content
        %div
          - cache @article.comments do |comment|
            %span= comment.name
.grid_4
  %h4 Tìm kiếm
4. Low-level Caching
class Article < ActiveRecord::Base
  def self.cached_published
    Rails.cache.fetch [name, "publish"] do
      published.to_a
    end
  end
end
- Rails.cache is instance of Cache Stores through cache_store
 - Can access anywhere
 
4. Low-level Caching
- 
Clear cache means that we clear rails session.
        
 - 
        Can not do operation like: list all keys, get matched...
        
 - 
        Not OOP
        
 
class Article < ActiveRecord::Base
  def self.cached_published
    Rails.cache.fetch [name, "publish"] do
      published.to_a
    end
  end
  def flush_cache
    Rails.cache.delete([self.class.name, "publish"])
  end
end
    
4. Low-Level Caching
class Article < ActiveRecord::Base 
  def self.cached_published
    Rails.cache.fetch [name, "publish"] do 
      published.to_a 
    end
  end
  def flush_cache
    Rails.cache.delete([self.class.name, "publish"])
  end
end
Acticle.cached.published
Article.delete_cached.published
Gem Munna
- 
Built on top of Rails.cache
 - 
Support cache analytics
 - 
Clear cache without effect on other rails caches.
 
class User < ActionRecord::Base
  def self.list_vip_users
    cached {
      where(:type => 'vip')
        .order('rank')
    }
  end
end
Caching Strategies
- 
            
HTTP Caching
 - 
            
Page Caching
 - 
            
Fragment Caching
 - 
            
Low-level Caching
 
Best Practices
Use HTTP caching as much as you can
Use Russian doll approach when rendering complex view
Use Rails.cache or Munna inside model to improve performance
Set expiring cache key for everything
Question?
Server Caching
By Minh Quy
Server Caching
- 2,118
 
