假设您有一个显示最新帖子的页面片段,并且您在 30 分钟后将其过期。我在这里使用 Rails。
<% cache("recent_posts", :expires_in => 30.minutes) do %>
...
<% end %>
显然,如果该片段存在,您不需要进行数据库查找来获取最新的帖子,因此您也应该能够避免这种开销。
我现在正在做的是 Controller 中类似这样的东西,它似乎可以工作:
unless Rails.cache.exist? "views/recent_posts"
@posts = Post.find(:all, :limit=>20, :order=>"updated_at DESC")
end
这是最好的方法吗?安全吗?
我不明白的一件事是为什么片段的键是“recent_posts
”,而稍后检查时键是“views/recent_posts
”,但我想出了这是在观看 memcached -vv
以查看它使用的内容之后。另外,我不喜欢重复手动输入“recent_posts
”,最好将其保存在一个地方。
想法?
最佳答案
埃文韦弗的 Interlock Plugin解决了这个问题。
如果您需要不同的行为,例如更细粒度的控制,您也可以轻松地自己实现类似的东西。基本思想是将您的 Controller 代码包装在一个 block 中,该 block 仅在 View 需要该数据时才实际执行:
# in FooController#show
@foo_finder = lambda{ Foo.find_slow_stuff }
# in foo/show.html.erb
cache 'foo_slow_stuff' do
@foo_finder.call.each do
...
end
end
如果您熟悉 ruby 元编程的基础知识,那么很容易将其包装在您喜欢的更简洁的 API 中。
这优于将查找器代码直接放在 View 中:
- 按照惯例将 finder 代码保存在开发人员期望的位置
- 让 View 忽略模型名称/方法,允许更多的 View 重用
我认为 cache_fu 在其中一个版本/分支中可能具有类似的功能,但记不起具体的了。
您从 memcached 中获得的优势与您的缓存命中率直接相关。注意不要浪费你的缓存容量,并通过多次缓存相同的内容而导致不必要的遗漏。例如,不要同时缓存一组记录对象及其 html 片段。通常片段缓存将提供最佳性能,但这实际上取决于您的应用程序的具体情况。
关于ruby-on-rails - 为 memcached 和 Rails 组合片段和对象缓存的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1034910/