[Rails 常用插件简介]timed_fragment_cache

周六在SOR(Shanghai On Rails 1st)上有点紧张,感觉讲的很是不好。这个也是我第一次public的场面上做topic,以前给同事培训,从没有过这样的感觉 :( 看来,俺还需要锻炼锻炼,下次一定不会这么差劲的状态了 :)

在最后的PPT中提到四个插件
1:sweeper generator (已经说过了,[url]http://mmm.iteye.com/blog/119332[/url])
2:timed_fragment_cache
3:cache_fu
4:cached_model

还是很不错的,一一的说明下,第一篇,最简单的timed_fragment_cache


在清除Rails缓存的策略中,我们常采用以下两条原则
1:基于Model的状态
2:基于时间的有效期

timed_fragment_cache 就是一个基于时间的有效期的插件,

一:Install

[code]
ruby script/plugin install http://svn.livsey.org/plugins/timed_fragment_cache
[/code]

二:Usage
1:在views中,和通常写法差不多,只是多了个失效时间的属性
[code]
<% cache 'fragment_name', 10.minutes.from_now do %>
the cached fragment which does something intensive
<% end %>
[/code]

以fragment_name为名称的片段缓存会在10分钟后失效,当再次访问的时候时间如果跟第一次生成缓存的时间相差大于10,那么会清除当前的缓存,并重新创建。

2:在controller中
[code]
when_fragment_expired 'fragment_name', 10.minutes_from_now do
# some intensive code
end
[/code]

和上面一样的效果

三:Dive into
使用很简单,我们现在再来看下源码,huhu,一共就一个timed_fragment_cache.rb,一样的简单。

代码覆盖了rails中的cache_erb_fragment
[code]
def cache_erb_fragment(block, name = {}, options = nil, expiry = nil)
unless perform_caching then block.call; return end
fragment = get_fragment(name)
#.... 这里多了这一段
#.... 首先判断是否采用了时间限制,是否已经缓存,如果有时间限制,并且没有缓存当前name的fragment的话
#.... 则缓存以fragment_cache_key(name) + '_meta'为key,缓存当前时间的信息
if expiry && !fragment
expire_and_write_meta(name, expiry)
end
#..... 下面一样写入Fragment Cache ...
end
[/code]


我们再来看一下读取fragment的代码,看它是如何判断时间过期的
[code]
def get_fragment(name)
#...
#... 获取有效时间
#... 如果有,并且已经大于当前的时间,则返回nil,否则返回缓存的片段代码
expires = expiry_time(name)
return expires && expires > Time.now ? fragment : nil
end
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值