2

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

我有几个模型像

class Bike < ActiveRecord::Base
act_as_cached
..........
end

class Car < ActiveRecord::Base
act_as_cached
..........这样
结束
我有更多模型


自行车。get_cache ("key") { Bike.find(...) }
汽车。get_cache ("key") { Car.find(...) }

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

4

1 回答 1

1

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

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

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

1)配置Passenger使用“Conservative Spawning”而不是“Smart Spawning”。但是,您将完全失去共享内存的优势。或者

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

在此博客文章中找到一个稍微不同的示例。

于 2013-10-03T08:59:04.643 回答