[Rails 常用插件简介]timed_fragment_cache

上一篇 / 下一篇  2007-10-22 11:40:01 / 个人分类:Rails 常用插件简介

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

在最后的PPT中提到四个插件
1:sweeper generator (已经说过了,http://ruby-lang.org.cn/forums/v ... 26amp%3Btypeid%3D25
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二:Usage
1:在views中,和通常写法差不多,只是多了个失效时间的属性

CODE:

<% cache 'fragment_name', 10.minutes.from_now do %>
  the cached fragment which does something intensive
<% end %>
以fragment_name为名称的片段缓存会在10分钟后失效,当再次访问的时候时间如果跟第一次生成缓存的时间相差大于10,那么会清除当前的缓存,并重新创建。

2:在controller

CODE:

when_fragment_expired 'fragment_name', 10.minutes_from_now do
  # some intensive code
end
和上面一样的效果

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

代码覆盖了rails中的cache_erb_fragment

CODE:

      def cache_erb_fragment(block, name = {}, ptions = 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
我们再来看一下读取fragment的代码,看它是如何判断时间过期的

CODE:

def get_fragment(name)
    #...
    #...  获取有效时间
    #...  如果有,并且已经大于当前的时间,则返回nil,否则返回缓存的片段代码
    expires = expiry_time(name)
    return expires && expires > Time.now ? fragment : nil
end
[本帖最后由 martin 于 2007-10-22 14:51 编辑]

TAG:

sishen发布于2007-10-22 16:43:03
zan~  原来那个是martin阿... 认识了.

关于这个, martin能不能举个实际例子来说明为什么要用timed?
lgn21st发布于2007-10-22 21:02:30
终于把社区英雄跟真人对上号了。
red_world maninred 发布于2007-10-22 23:47:20
上面两位都见过Martin拉,描述一下。
Martin's Thought martin 发布于2007-10-23 09:37:22
huhu~~~ 那天的状态太差,大家留情啊 o._.o 呵呵
red_world maninred 发布于2007-10-23 10:03:29

QUOTE:

原帖由 martin 于 2007-10-23 09:37 发表
huhu~~~ 那天的状态太差,大家留情啊 o._.o 呵呵
Martin太谦虚了,真想现场听听Martin的演讲。Martin讲讲那天还有什么有趣的事情阿。
Martin's Thought martin 发布于2007-10-23 10:08:28
呵呵,那天我一开始差点卡壳了:)
我来说两句

(可选)

日历

« 2009-07-05  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 286
  • 日志数: 19
  • 建立时间: 2007-08-13
  • 更新时间: 2008-01-23

RSS订阅

Open Toolbar