ruby-on-rails - 带有 Memcache 的 Rails 返回错误的缓存对象?

标签 ruby-on-rails ruby caching memcached

我有一个相当大的 Rails 应用程序,它在单独的服务器上使用 memcached 作为其缓存存储。

问题是我在生产环境中随机出现错误,似乎表明 memcached 正在返回不正确的对象。

例子:

在这个例子中,current_site 是一个辅助方法,它访问 Site 模型上的一个方法,该模型使用 Rails.cache 来缓存模型

ActionView::TemplateError in ListingsController#edit
undefined method `settings' for #<String:0xb565f8a0>

On line #12 of app/views/layouts/site.html.erb

    9:         <meta name="robots" content="noodp, all" />
    10:         <meta name="distribution" content="Global" />
    11: 
    12:         <% unless current_site.settings[:google_webmaster_verification_code].blank? %>
    13:         <meta name="verify-v1" content="<%= current_site.settings[:google_webmaster_verification_code] %>" />
    14:         <% end %>
    15: 

与……对比

ActionView::TemplateError in ApplicationController#not_found
undefined method `settings' for #<Category:0xd5c6c34>

On line #12 of app/views/layouts/site.html.erb

    9:         <meta name="robots" content="noodp, all" />
    10:         <meta name="distribution" content="Global" />
    11: 
    12:         <% unless current_site.settings[:google_webmaster_verification_code].blank? %>
    13:         <meta name="verify-v1" content="<%= current_site.settings[:google_webmaster_verification_code] %>" />
    14:         <% end %>
    15: 

当两者都应该返回一个 Site 模型时!

另一个缓存行为异常的例子:

ActionView::TemplateError in AccountsController#show
can't convert Category into String

On line #141 of app/views/layouts/site.html.erb

    138:                    <li<%=  class="first" if i == 0 %>><%= link_to top_level_category.title, top_level_category.path %></li><% end %>
    139:                </ul>
    140:            <% end %>
    141:            <% cache bottom_pages do %>
    142:                <ul><% Page.top_level.active.show_in_navigation.find(:all, :include => :slugs).each_with_index do |top_level_page, i| %>
    143:                    <li<%=  class="first" if i == 0 %>><%= link_to top_level_page.title, top_level_page.path %></li><% end %>
    144:                </ul>

有没有人遇到过这样的事情?任何人都想过诊断这个无法复制的问题!?我试过切换出 memcached 客户端 gem,认为这可能是一个奇怪的错误,但这没有任何效果!谢谢。

最佳答案

这是由 Passenger 共享其与 Memcached 服务器的连接引起的。检查http://www.modrails.com/documentation/Users%20guide.html#_example_1_memcached_connection_sharing_harmful .

修复只是将 Passenger 的 Rails spawn 更改为 conservative

关于ruby-on-rails - 带有 Memcache 的 Rails 返回错误的缓存对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734664/

相关文章:

ruby-on-rails - 如何在 has_many 的情况下通过 : association? 验证关联记录的存在

ruby-on-rails - ruby install Rails 出现错误 ---无法构建 gem native 扩展。(Windows 平台)

caching - 内核可以管理写在TLB条目上的进程ID吗?

Windows Server AppFabric 缓存 session 存储

ruby - 从字符串数组生成唯一的初始字符串

java - 如何在 Java 中缓存具有可变参数 (Varargs) 的函数的结果

ruby-on-rails - Rails 路由器中的变量根

ruby-on-rails - 在模型中的belongs_to中使用委托(delegate)时出现 'uninitialized constant'错误

ruby-on-rails - 默认情况下,是否有任何 HTTP 日志文件保存在我的系统上?

ruby - 使用 `and` 进行赋值