4

私の Rails アプリには、Redis 接続を作成するイニシャライザーがあります。

$redis = Redis.new(:host => 'localhost', :port => 6379, :db => 3)

私の質問は、この接続はこのアプリのすべてのワーカーで共有されるのか、それとも $redis を使用するたびに各ワーカー スレッドが独自の接続を作成するのかということです。

4

1 に答える 1

4

connection_pool任意のネットワーク クライアントの汎用プールであるgem を使用してみることができます。

Gemfile:

gem 'connection_pool'

初期化子/redis.rb:

require 'connection_pool'

conf = YAML.load(File.read(File.join('config','redis.yml')))
redis_config = conf[Rails.env.to_s]

Redis.current = ConnectionPool.new(size: 10, timeout: 5) do 
  Redis.new host: redis_config['host'], port: redis_config['port'], db: redis_config['db']
end

config/redis.yml

development:
  host: localhost
  port: 6379
  db: 0
test:
  host: localhost
  port: 6379
  db: 15
production:
  host: localhost
  port: 6379
  db: 0

その後、コードで次のようにします。

Redis.current.with do |conn|
  value = conn.get('foo')
  conn.sadd('bar', 1)
end

withブロック内にはconn、プールからの Redis オブジェクトが含まれます。ブロックが正常に終了したとき、または例外がスローされたためにプールに返されます。

于 2013-09-05T09:51:51.640 に答える