在Puma fork之后重新连接Redis

hau*_*hau 5 ruby-on-rails redis puma

我在rails应用程序中使用全局变量来使用redis gem存储redis客户端.在一个config/initializers/redis.rb,我有

$redis = Redis.new(host: "localhost", port: 6379)
Run Code Online (Sandbox Code Playgroud)

然后在应用程序代码中,我$redis用来处理Redis存储中的数据.

我还使用puma作为生产环境中的Web服务器,并使用capistrano来部署代码.在部署过程中,capistrano重启puma.

每次我启动或重新启动美洲狮网络服务器时,我第一次使用$redisRedis商店中的数据时总是会出现"内部服务器错误" .我看到了错误Redis::InheritedError (Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.)

搜索谷歌和stackoverflow让我认为我需要重新连接到美洲狮分叉子进程后重新连接到Redis.所以,我补充说config/puma.rb:

on_worker_boot do
  $redis.ping
end
Run Code Online (Sandbox Code Playgroud)

但我仍然得到了"内部服务器错误" Redis::InheritedError (Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.).

我看过这篇文章http://qiita.com/yaotti/items/18433802bf1720fc0c53.然后我尝试添加config/puma.rb:

on_restart do
  $redis.quit
end
Run Code Online (Sandbox Code Playgroud)

那没用.

我试图config/initializers/redis.rb$redis.ping右后Redis.new.那也行不通.

如果puma在没有运行puma进程的情况下启动,或者在运行puma进程的实例时重新启动,则会出现此错误.

刷新页面会让我超过此错误.但我想在第一次尝试使用时摆脱这种情况$redis.我以为我没有使用redisgem或正确配置它的重新连接.有人能告诉我:

  1. 这是redis在rails应用程序中使用gem 的正确方法吗?
  2. 如何redis重新连接连接puma

pumagem文档说,"你应该放置代码来关闭这个块中的全局日志文件,redis连接等,这样它们的文件描述符就不会泄漏到重新启动的进程中.如果不这样做将导致描述符慢慢耗尽,最终服务器多次重启时,模糊的崩溃." 它在讨论这个on_restart块.但它没有说应该怎么做.

Duk*_*uke 0

这就是我所做的:

  Redis.current.client.reconnect
  $redis = Redis.current
Run Code Online (Sandbox Code Playgroud)

($redis 是我的 redis 客户端的全局实例)