打印

[Rails 常用插件简介]Sweeper Generator

本帖已经被作者加入个人空间

[Rails 常用插件简介]Sweeper Generator

注:Rails常用插件系列仅仅发于我的javaeye博客(http://mmm.javaeye.com/)和http://www.ruby-lang.org.cn,任何转载请注明出处,多谢!

cache是系统中必不可少的东西,那么cache的有效期,何时清除过时的cache就显得更加有意思的一个话题。Sweeper Generator 顾名思义是一个Generator,清除过时的cache

0:) cache
Rails中目前有三种cache
caches_pages
caches_action
caches_fragment

cache还不懂?那就先收藏着吧,等下次有时间开个专题讨论一下cache,这里就不废话了。

1:) 安装

ruby script/plugin install http://topfunky.net/svn/plugins/sweeper


2:) 使用
运行

ruby script/generate


可以看到sweeper

php?name=Install" onclick="tagshow(event)" class="t_tag">Installed Generators
  Plugins: sweeper


我们使用cache Fragment在页面上缓存论坛分类

<% cache(cache_key('categories')) do -%>
....
<%end%>


启动server,浏览页面,第一次运行会看到

Cached fragment: localhost:3000/cache/categories (0.00000)


同时在cache目录下找到 categories .cache文件,打开浏览,你会看到正式你浏览页面的html文件

刷新页面,再次浏览,会看到

Fragment read: localhost:3000/cache/categories (0.00000)


执行查询分类的sql已经不在运行了,仅仅是读取cache的文件而已。

ok,转到后台,新增分类,再转前台,刷新

Fragment read: localhost:3000/cache/categories (0.00000)


刚才添加的新分类怎么没了??

是缓存的原因,当前的页面片段存在缓存,而我们刚才新增加的分类后,并没有删除过时的cache,手工删除categories.cache,再删除

Cached fragment: localhost:3000/cache/categories (0.00000)


OK,成功了。

可是这样繁琐了点:(

不怕:) rails自有利器,该Observer发挥作用了 (Observer是什么?OH, NO,这个,建议你没事看看设计模式,简单点说就是一个观察着模式),而Sweeper用的也是这个

先来看一下Sweeper Generator的usage

./script/generate sweeper SweeperName callback1 callback2


OK,我们来生成我们想要的东西

ruby script/generate sweeper Record after_save after_update after_destroy


生成

class RecordSweeper < ActionController::Caching::Sweeper
    def after_save(record)
    end

    def after_update(record)
    end

    def after_destroy(record)
    end
end


添加我们观察的对象

observe Forum


新建forum时候,我们删除掉过时的cache

def after_save(record)
    expire_fragment(cache_key('categories'))
end


更多点的代码:

class RecordSweeper < ActionController::Caching::Sweeper
    observe Forum, Topic

    def after_save(record)
        expire_record(record)
    end

    def after_update(record)
            expire_record(record)
    end

    def after_destroy(record)
        expire_record(record)
    end

    def expire_record(record)
        logger.info record
        case record
        when Forum
            expire_fragment(cache_key('fourm_list'))
            expire_fragment(cache_key('categories'))
            expire_fragment(cache_key("fourm_list_#{record.parent_id}")) if record.forum_type==2

            expire_fragment(cache_key("nested_forum_list_#{record.parent_id}")) if record.forum_type==3
        when Topic, Post
            expire_fragment(cache_key("thread_list_#{record.forum_id}"))
        end
        #footer,quick_post,smiles
    end
end


在你的environment中添加
config.active_record.observers = :record_sweeper

现在转到后台,新增分类测试下。当提交时,会发现console多了几条信息

Expired fragment: localhost:3000/cache/categories (0.00000)


cache已经清楚了

再次浏览index会发现重新生成了cache

Cached fragment: localhost:3000/cache/categories (0.00000)


[ 本帖最后由 martin 于 2007-9-2 00:35 编辑 ]
本帖最近评分记录
  • drive2me R币 +2 useful and helpful. 2007-9-2 07:15

TOP

呵,你总有好东东带给我们哟,谢谢。学了,还要收藏!

看你的文章随着你的感情走,好生动。这是你的特点,把貌似复杂的技术文章,用表情符号使他们简单化了,很好的沟通技巧。

有时间开Cache的专题吧,需要的话,就加一个分版。

[ 本帖最后由 drive2me 于 2007-9-2 07:21 编辑 ]
Flying Piggy...! 
天地人合一!

TOP

好的啊,等有时间可以整理一个cache系列的文章。

谢谢捧场,写的不好,请多多提意见 o_o

TOP

2009-07-04 06:57 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.57