memo.yomukaku.net

RailsのinitializerでRedisに接続する時は必ず最初に$redis.pingする

Railsでredis-rbを使ってRedisに接続するアプリを作る場合、Railsアプリの初期化時にRedisに接続を行うことが多いと思います。

/app/config/initializers/redis.rbのようなファイルの中で$redis = Redis.newにより接続を準備しますが、Redis.newはRedisクラスのオブジェクトを作成するだけなので、仮に接続のための設定に誤りがあったりRedisのサーバー自体が起動していなくても例外になりません。

すると、Railsのアプリ本体のコードのどこかで後に$redisを使ってDBへの接続やpub/subなどを行った時点で突然例外が発生することになります。

このような事態を避けるためには、/app/config/initializers/redis.rbの中で$redis = Redis.newを行った直後に$redis.pingを実行して接続を確認しておきます。

/app/config/initializers/redis.rbというファイルの中でRedisのオブジェクトを作成する場合は次のようにします。

# coding:utf-8
# /app/config/initializers/redis.rb
$redis = Redis.new(:host => APP_CONFIG['redis']['host'], :port => APP_CONFIG['redis']['port'])
$redis.ping

# /Users/foo/.rvm/gems/ruby-1.9.2-p180/gems/redis-2.2.2/lib/redis/client.rb:236:in `rescue in establish_connection': Connection refused - Unable to connect to Redis on 127.0.0.1:6378 (Errno::ECONNREFUSED)

もしport, hostやsocket等の接続設定に問題があったり、接続先のRedisがそもそも起動していない場合はErrno::ECONNREFUSEDの例外が発生し、Railsのinitializeが完了しなくなるため、Redisに接続できないにもかかわらずRailsだけが起動することを避けられます。

blog comments powered by Disqus