web-dev-qa-db-ja.com

Ruby on railsを使用した$ redisグローバル変数

読み取りキャッシュとしてredisを使用しています。イニシャライザを作成しました

config/initializer/redis.rb

$redis = Redis.new(:Host => ENV["REDIS_Host"], :port => ENV["REDIS_PORT"])

新しいワーカーが作成されるたびに、Unicorn.rbでこのグローバルを使用して新しい接続を作成しています。

before_fork do |server, worker|
  # clear redis connection
  $redis.quit unless $redis.blank?
end

# Give each child process its own Redis connection
after_fork do |server, worker|
  $redis = Redis.new(:Host => ENV["REDIS_Host"], :port => ENV["REDIS_PORT"])
end

また、redisサーバーにアクセスする必要があるときはいつでも、このグローバル変数を使用しています。しかし、私はこのグローバル変数の使用に慣れていません。グローバル変数を使用するよりも良いオプションはありますか?

34
Anirudhan J

メスタッハの提案をさらに拡張し、イニシャライザのモジュールを以下のようにネームスペース

config/initializers/redis.rb

module ReadCache
  class << self
    def redis
      @redis ||= Redis.new(:url => (ENV["REDIS_URL"] || 'redis://127.0.0.1:6379'))
    end
  end
end

その後、Unicorn.rb

 before_fork do |server, worker|
    ...
   if defined?(ReadCache.redis)
    ReadCache.redis.quit
   end
    ...
 end

 after_fork do |server, worker|
    ...
   if defined?(ReadCache.redis)
    ReadCache.redis.client.reconnect
   end
    ...
 end
28
blotto

Redis.currentがあり、これを使用して、唯一のRedisインスタンスを格納できます。

したがって、$redisを使用する代わりに、次のようにインスタンスを割り当てることができます。

Redis.current = Redis.new(:Host => ENV["REDIS_Host"], :port => ENV["REDIS_PORT"])

Redis.current2010年にredis-rbに導入 であり、redis接続を取得する標準的な方法であるため、他の回答で言及されていないことに驚きました。

74

まだ別のRails.cacheを使用していない場合は、そのメカニズムをredisで使用することをお勧めします。

Gem redis-storeはこれを本当に簡単にします( https://github.com/redis-store/redis-store

このようにして、Rails.cache.reconnectそしてすべてはダンディです

https://github.com/redis-store/redis-store/issues/21#issuecomment-948569

また、素晴らしいRails.cache APIを使用することもできます。これには、いくつかの優れた機能があります。 http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html

0
Sascha Kaestle

グローバル変数を置き換えるmore namespacedオプション。モジュールにメソッドを作成できます

モジュールキャッシュ
 def self.redis 
 ...ここで初期化/メモ化/再接続... 
終了
終了

次に、次のように呼び出します。

Caching.redis

0
mestachs

this Herokuによると、ユニコーンに$redisを追加する必要はありません。

UnicornサーバーでRedis Cloudを使用する場合、特別な設定は必要ありません。 Rails Unicornのアプリを実行しているユーザーは RailsからのRedisの設定 セクションの指示に従う必要があります。

RailsからRedisを構成する セクション」の前のすべてのRails 4(Gemfileと他のいくつかのRails 3以前のもの)以外):

# config/initalizers/redis.rb

if ENV["REDISCLOUD_URL"]
  uri = URI.parse(ENV["REDISCLOUD_URL"])
  $redis = Redis.new(:Host => uri.Host, :port => uri.port, :password => uri.password)
end

「特別な設定が必要ない」理由についての説明はありません。

0
gabe