ruby-on-rails - 在 Passenger fork 上重新启动 Rails Redis Cache Store 连接

标签 ruby-on-rails caching redis passenger

我想使用 redis 缓存存储(使用 redis-store gem)。

它在本地运行良好,但在 Passenger 派生多个 Rails worker 实例的生产环境中,我们收到 Redis 错误,这表明不同实例之间关于 Redis 访问的同步问题。

此类错误的示例是

 Got '7' as initial reply byte. If you're running in a multi-threaded environment, make sure you pass the :thread_safe option when initializing the connection. If you're in a forking environment, such as Unicorn, you need to connect to Redis after forking.
  redis (2.2.2) lib/redis/connection/ruby.rb:78:in `format_reply'

我读了一些书,了解到每个 Passenger worker 实例都必须创建自己的 Redis 连接。这可以使用以下代码实现

#config/initializers/redis_fork_init.rb
if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    if forked
      $redis = Redis.new
    end
  end
end

假设 Redis 访问是通过整个代码中的 $redis 完成的 - 这个解决方案很棒。

我的问题是 - 我如何创建一个新的 Redis 连接,当我执行 Rails.cache 操作(例如读取、写入等...)时将使用该连接?

我的 config/environments/production.rb 包括以下内容:

config.cache_store = :redis_store, { :host => 'localhost', :port => 6379, :thread_safe => true } 

使用 Rails 3.2.3、Redis 2.2.2、redis-store 1.1.1、Passenger 3.0

最佳答案

看一下redis store的reconnect方法: https://github.com/jodosha/redis-store/blob/master/redis-activesupport/lib/active_support/cache/redis_store.rb

所以基本上你的 fork block 应该是这样的:

if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    if forked
      Rails.cache.reconnect
    end
  end
end

关于ruby-on-rails - 在 Passenger fork 上重新启动 Rails Redis Cache Store 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383450/

相关文章:

ruby-on-rails - 这种关键字在 Ruby 中有什么作用?

c# - 在 ASP.NET 5/MVC 6 中使用 IDistributedCache 和 Redis - 类型或命名空间 'Microsoft.Caching' 不存在

android - 有没有办法以编程方式清除所有缓存文件?

kotlin - Redis对客户端进行认证,同时选择RESP协议(protocol)版本

redis - 为什么redis集群只有16384个槽位?

ruby-on-rails - 我应该从模型回调还是从 Controller 发送邮件?

javascript - 是否可以将现有的 Facebook Connect session 与 Facebooker 一起使用?

phpExcel 如何将设置传递给类

redis - 如何删除redis中的整个流?

ruby-on-rails - Rails - 在 ActiveRecord 数据库查询中使用 current_user.id