注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研自动组

快乐耕耘,收获成长!

 
 
 

日志

 
 

Rails中缓存机制的调研与运用  

2011-01-07 15:33:34|  分类: 平台开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


作者:小云 


Rails中提供了下面的三种缓存机制
1、页面缓存 - 最快
2、Action缓存 - 第二
3、Fragment 片段缓存 - 第三

缓存的配置

production模式下的缓存默认是开启的,但是development模式下默认是不开启的,需要修改/config/environments/development.rb文件
1
config.action_controller.perform_caching = true # 此选项改成true,启动开发模式下的缓存

页面缓存

页面缓存是最快速的一种缓存应用。主要应用在:
1、对于所有用户都相同的页面
2、公开的页面,没有用户认证的页面

使用方法:
在controller中对于需要缓存的页面对应的action加入 caches_page :login
1
2
3
4
5
class AccountController < ApplicationController
layout 'base', :except => :login
helper :custom_fields
caches_page :login # 加入页面缓存
end

页面缓存存放路径
页面缓存默认是存放在应用的public/目录下

action缓存

action缓存和page缓存的区别
action缓存和page缓存非常的相似,唯一的不同是,action缓存中,页面请求会执行rails服务和你定义的filters

使用方法
在对应的action加入caches_action即可
必须注意的是: before_filters 要在你的 caches_action 之前,并在你的controller顶部 ,否则可能得到错误的html缓存。
1
2
3
4
5
class AccountController < ApplicationController
layout 'base', :except => :login
helper :custom_fields
caches_action :login # 加入action缓存
end

action缓存存放路径
action缓存默认是存放在应用的tmp/cache/ 目录下

片段缓存

对于动态页面比较适合的是片段缓存,找出变化不是很大的部分,或者性能消耗比较大的部分做片段缓存。

使用方法:
Redmine的版本库比较中也使用了片段缓存,不用每次diff的时候都去查询数据库。
在RepositoriesController的diff方法中有如下一段代码:
1
2
3
4
5
6
@cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#
{@rev}-
#{@rev_to}-#{@diff_type}"
) # 缓存的存放位置
unless read_fragment(@cache_key) # 判断缓存是否存在,存在则不进行diff操作,直接取缓存中的内容
@diff = @repository.diff(@path, @rev, @rev_to, @diff_type)
show_error_not_found unless @diff
end

页面中的diff.rhtml代码如下:
1
2
3
4
5
<% cache(@cache_key) do -%>  # 需要缓存的页面部分加入如下cache语句*(@cache_key)* 是缓存的存放路径,没有该参数的话就放在默认的地方
<% @diff.each do |table_file| -%
>

.....
<%end%>
<%end%>

片段缓存存放路径
片段缓存默认是存放在应用的tmp/cache/ 目录下

片段缓存的高级命名

如果需要自定义缓存的存放路径名可以使用以下方式
1
2
3
4
cache ("issues") => "/tmp/cache/issues.cache" 
cache (:controller => 'issues', :action => 'show', :id => 1) => "/tmp/cache/localhost:3000/issues/show/1.cache"
cache ("issues/show") => "/tmp/cache/issues/show.cache"
cache ("#{request.host_with_port}/issues/show") => "/tmp/cache/localhost:3000/issues/show.cache"

如何清除缓存

1. 清除页面缓存

1
2
3
4
# 清除 /issues/show.html
expire_page(:controller => 'issues', :action => 'show')
# 清除 /issues/show/5.html
expire_page(:controller => 'issues', :action => 'show', :id => 5)

2. 清除action缓存

1
expire_action(:controller => 'issues', :action => 'show', :id => issue.id)

3.清除片段缓存

1
expire_fragment(:controller => 'issues', :action => 'show', :id => issue.id)

修改action缓存以及片段缓存的存储方式

页面缓存,只能在文件系统里储存,对于action缓存和片段缓存,可以有几个方案选择。
1、文件系统,默认的,将缓存的信息文件放入你的硬盘。默认在/tmp/cache/ 这个目录里。
2、内存中
3、DRb Store分布式储存,缓存文件将在"Distributed Ruby"处理过程中储存,当然一个ruby进程可以和所有的服务进行沟通。(原文:DRb Store - Cached pages are stored in a "Distributed Ruby" Process. Basically a separate ruby process that all of your servers can communicate with)
4、memcache储存,memcache是专门为缓存设计的,虽然他不是ruby写的,但是他相当的快,很多大型项目在使用他。(原文:It's not written in Ruby, but it's damn fast and it's what all the big boys use)
如果你想改变缓存方式,你只需要对config/environment.rb进行一个修改即可。
config.action_controller.fragment_cache_store = :file_store, "#{RAILS_ROOT}/cache"


  评论这张
 
阅读(328)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018