清单 8. 通过 URL 标识缓存分段
<% cache @cause.permalink(params[:id]) do %>
通常,当缓存单独页面时,需要用清理器使之过期失效。有时,使用简单的基于时间的对象过期更为容易和简洁。默认地,Rails 并不提供这类机制,但有一种插件名为 timed_fragment_cache 可以实现这一目的。借助这个插件,我可以指定超时,可以在缓存了的内容中指定,也可以在为此页提供了动态数据的控制器代码中指定。例如,清单 9 所示的代码就可以为此页面构建动态数据。when_fragment_expired 方法只有在相关的缓存分段过期时才会执行。此方法接受参数,用来指定超时的时长,它还接受一个代码块,用来指定当内容过期时哪些内容需要重建。我也可以选择在 rhtml 页面中指定超时和缓存方法,但我更愿意使用基于控制器的方法。
清单 9. 基于时间的缓存到期
def index when_fragment_expired 'causes_list', 15.minutes.from_now do @causes = Cause.find_all_ordered end end
如果能够容忍数据稍微有些陈旧,那么使用定时的到期机制将可以极大地简化缓存策略。对于每个被缓存的元素,只需指定想要缓存的内容、可生成动态内容的任何控制器动作以及超时。与页面缓存类似,如果需要,也可以使用 expire_fragment :controller => controller, :action => action, :id => id 方法显式让内容到期。此方法的工作方式与缓存动作和缓存页面的到期失效是一样的。接下来,我将介绍如何配置此后端。
Memcached
至此为止,我已经介绍了 Ruby on Rails 的页面和分段缓存模型。看过了 API 之后,现在就可以定义缓存后的数据的去处了。默认地,Rails 将把缓存后的页面放入文件系统。缓存后的页面和动作都会进入公共目录。可以配置缓存后的分段的存储位置。为此,需要用到内存存储、文件系统(在所定义的目录)、数据库或称为 memcached 的服务。对于 ChangingThePresent.org,我们使用 memcached。
可以将 Memcached 想象为一个大型的 hash 图,这个图可通过网络获得。基于内存的缓存速度快,而基于网络的缓存的可伸缩性比较好。有了插件支持,Rails 就可使用 memcached 来缓存分段和 ActiveRecord 模型。要使用它,需要安装 memcached(更多信息,请参看 参考资料)并在 environment.rb(或其他的环境配置文件,比如 production.rb)对它进行配置。
清单 10. 配置缓存
config.action_controller.perform_caching = true
memcache_options = {
:c_threshold => 10_000,
:compression => false,
:debug => false,
:readonly => false,
:urlencode => false,
:ttl => 300,
:namespace => 'igprod',
:disabled => false
}
CACHE = MemCache.new memcache_options










