gpt4 book ai didi

ruby-on-rails - 为 memcached 和 Rails 组合片段和对象缓存的最佳方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:00 27 4
gpt4 key购买 nike

假设您有一个显示最新帖子的页面片段,并且您在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com