@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
- 1,902