私の Rails アプリには、Redis 接続を作成するイニシャライザーがあります。
$redis = Redis.new(:host => 'localhost', :port => 6379, :db => 3)
私の質問は、この接続はこのアプリのすべてのワーカーで共有されるのか、それとも $redis を使用するたびに各ワーカー スレッドが独自の接続を作成するのかということです。
私の Rails アプリには、Redis 接続を作成するイニシャライザーがあります。
$redis = Redis.new(:host => 'localhost', :port => 6379, :db => 3)
私の質問は、この接続はこのアプリのすべてのワーカーで共有されるのか、それとも $redis を使用するたびに各ワーカー スレッドが独自の接続を作成するのかということです。
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 オブジェクトが含まれます。ブロックが正常に終了したとき、または例外がスローされたためにプールに返されます。