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

标签 ruby-on-rails ruby caching memcached fragment

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

相关文章:

ruby-on-rails - Rails has_many :through with :primary_key

CSS 更改未在网站上更新

ruby-on-rails - 全局化轮胎 Elasticsearch 和重音折叠

ruby-on-rails - 设计和 password_confirmation 验证

ruby-on-rails - Rake 和 RVM 的 Ruby 2.5.0 警告

php - Codeigniter:数据库缓存检查记录是从数据库还是从缓存加载

java - 对于堆上 Java 缓存来说,多少数据太多了?我应该什么时候开始考虑堆外缓存?

ruby-on-rails - rails : how do you access belongs_to fields in a view?

ruby-on-rails - 使用 minitest 正确模拟环境变量?

ruby - 连续上传时出现Elasticsearch Connect错误