Rails Cache

29
Rails Cache 徐祥军 [email protected] http://www.recity.net 级别:基础

description

shanghaionrails first event presentation given by martin.xus

Transcript of Rails Cache

Page 1: Rails Cache

Rails Cache

徐祥军

[email protected]://www.recity.net

级别:基础

Page 2: Rails Cache

Shanghai On Rails 2007

About ReCity

ReCity -- 城市信息分享平台

• 所有信息均来自于用户

• 用户创建、拥有、维护和分享

• 创新机制使得信息能自动趋于准确、及时、有效

• 不仅仅分享信息,还分享收益

Page 3: Rails Cache

Shanghai On Rails 2007

Rails Cache

• Page Cache• Action Cache• Fragment Cache

Page 4: Rails Cache

Shanghai On Rails 2007

Use Cache

config.action_controller.perform_caching = true

Page 5: Rails Cache

Shanghai On Rails 2007

Page Cache

• Rails 内速度最快的一种缓存

• 简单,容易使用

• Cached Page,不必再执行Rails,直接由Web Server加载静态的Html页面

Page 6: Rails Cache

Shanghai On Rails 2007

Page Cache Example

class UsersController < ApplicationControllercaches_page :show

def show…

end

end

Page 7: Rails Cache

Shanghai On Rails 2007

$ ls public/users/show100.html

http://localhost/users/show/100

Rendering users/showCached page: /users/show/100.html

Page 8: Rails Cache

Shanghai On Rails 2007

Page Cache Sweeperclass UserSweeper < ActionController::Caching::Sweeperobserve User

def after_update(record)expire_page :controller=>:users,:action=>:show,:id=>record.id

end…

end

class UsersController < ApplicationControllercache_sweeper :user_sweepercaches_page :show

Page 9: Rails Cache

Shanghai On Rails 2007

Expired page: /users/show/100.html (0.00000)

User.find(100).update_attribute :login,’something’

Page 10: Rails Cache

Shanghai On Rails 2007

Page Cache Problems• Page Cache的内容是静态的html,是完全public,所有用

户看到完全一样的页面,如何处理极少量的不一致或个性化的内容或有有权限验证的内容

1. Ajax2. Client Javascript3. 放弃,改用Action Cache或其他Cache

Page 11: Rails Cache

Shanghai On Rails 2007

Page Cache Problems• Page Caches生成的文件名是通过url_for生成的,参数不

会被保存

分页?page=1 复杂?sort=score&user_id=100&category_id=1

1:将参数配置到routes里面去,/users/list/page

2:放弃,采用其他的cache

Page 12: Rails Cache

Shanghai On Rails 2007

Action Cache

• 类似Page Cache• Action Cache 执行

1. 调用controller2. 执行before_filter3. 检测cache是否存在,如果存在则返回cache

• 要比Page Cache慢,但是也够快

• 底层调用的Fragment Cache

Page 13: Rails Cache

Shanghai On Rails 2007

Action Cache Example类似于Page Cache:caches_action,expire_action

class UsersController < ApplicationControllerbefore_filter :authenticate caches_page :showcache_sweeper :user_sweeper

def show…

end

end

Page 14: Rails Cache

Shanghai On Rails 2007

Rendering users/showCached fragment: localhost/users/show/100 (0.00000)

http://localhost/users/show/100

$ ls -al tmp/cache/localhost/users/show/*… tmp/cache/localhost/users/show/100.cache

Fragment read: localhost/users/show/100 (0.00000)

Page 15: Rails Cache

Shanghai On Rails 2007

expire_action :controller=>:users,:action=>:show,:id=>record.id

Page 16: Rails Cache

Shanghai On Rails 2007

Action Cache Problem

• 查询字符

caches_action_with_paramsexpire_action_with_params

Page 17: Rails Cache

Shanghai On Rails 2007

Fragment Cache

• 用于cache 视图中代码块

• 默认会在/tmp/cache目录下生成.cache文件

• 清除缓存 expire_fragment

Page 18: Rails Cache

Shanghai On Rails 2007

Fragment Cache Example

<%cache do%><ul><%@users.each do |user|%><li><%=link_to user.login,user_path(user)%></li>

<%end%></ul><%end%>

Page 19: Rails Cache

Shanghai On Rails 2007

但是还是执行了查询?

unless read_fragment()@users = User.paginate :all, :page=>params[:page]||1

end

Page 20: Rails Cache

Shanghai On Rails 2007

Fragment Cache

• 自定义片段的名称

页面中的fragment cache多于一个时,需指定额外名称

类似url_for

cache(:action=>’show’,:part=>’users’)cache(:action=>’show’,:part=>’users’,:page=>1 [,…])

localhost/users/show?page=1localhost/users/show?page=1&part=users

expire_fragment [params…]

Page 21: Rails Cache

Shanghai On Rails 2007

Action/Fragment Cache 存储方式

• 内存

• 文件

• DRB• MemCached

Page 22: Rails Cache

Shanghai On Rails 2007

Expiring Strategy

• Model状态

• 时间

• Others

Page 23: Rails Cache

Shanghai On Rails 2007

Useful Plugins

• sweeper generator• timed_fragment_cache• cache_fu• cached_model

Page 24: Rails Cache

Shanghai On Rails 2007

sweeper generator

./script/generate sweeper SweeperName callback1 callback2

Page 25: Rails Cache

Shanghai On Rails 2007

timed_fragment_cache

• View<% cache 'fragment_name', 10.minutes.from_now do %>

#the cached fragment which does something intensive<% end %>

• Controllerwhen_fragment_expired 'fragment_name', 10.minutes_from_now do

#some intensive codeend

Page 26: Rails Cache

Shanghai On Rails 2007

cache_fu

class User < ActiveRecord::Baseacts_as_cached

end

Page 27: Rails Cache

Shanghai On Rails 2007

CachedModel

class User < CachedModelend

Page 28: Rails Cache

Shanghai On Rails 2007

More

• Mode Cache• Query Cache(Edge Rails)

Page 29: Rails Cache

Shanghai On Rails 2007

[email protected]