【问题标题】:memcache fetching wrong values while using acts_as_cached plugin使用acts_as_cached插件时memcache获取错误值
【发布时间】:2013-10-02 11:28:09
【问题描述】:

我已经安装了 memcached gem 和acts_as_cached 插件。

我有几个模型像

类自行车 act_as_cached
..........
结束

汽车类 act_as_cached
..........
结束
像这样我有更多的模型


Bike.get_cache("key") { Bike.find(...) }
Car.get_cache("key") { Car.find(...) }

即使我在维护不同的键,它也会获取错误的对象而不是所需的对象。

【问题讨论】:

  • 由于acts_as_cached 插件已经很老了,我猜你正在使用一个旧的Rails 应用程序。正确的?以前有效吗?这种情况有时会发生还是总是会发生?
  • 它有时会发生......有时它什么也没拿,有时它抛出错误的对象,有时它工作完美。
  • 我使用的是 Ruby 1.8.7 和 Rails 2.3.12
  • 您使用 Phusion Passenger 作为应用服务器吗?
  • Phusion 乘客版本 3.0.8

标签: ruby-on-rails ruby web-applications activerecord memcached


【解决方案1】:

Phusion Passenger 通过分叉现有进程来生成新服务器。之后,不同的进程共享代码。一方面,与例如 mongrel 服务器相比,这节省了大量内存。另一方面,如果未正确重置共享连接,这可能会使 memcached 感到困惑。

当用户会话混淆时,我曾经有过类似的经历。真吓人。

这个问题有两种解决方案:

1) 将乘客配置为使用“保守生成”而不是“智能生成”。但是,您将完全失去共享内存的优势。或者

2) 确保在乘客产生新的服务器进程时重置 memcached 连接。我使用以下代码来执行此操作。放入config/initializers/memcached_reset.rb

if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    if forked
      # Close duplicated memcached connections - they will open themselves
      Rails.cache.instance_variable_get(:"@data").try(:reset) if Rails.cache.instance_variable_get(:"@data").respond_to?(:reset)
    end
  end
end

this blog post 中找到一个稍微不同的示例。

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2014-11-26
    • 2017-05-27
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多