在我的 Rails 应用程序中,我有一个创建 Redis 连接的初始化程序:
$redis = Redis.new(:host => 'localhost', :port => 6379, :db => 3)
我的问题是:这个连接是为这个应用程序的所有工作人员共享的,还是每次我使用 $redis 时每个工作线程都会创建自己的连接?
在我的 Rails 应用程序中,我有一个创建 Redis 连接的初始化程序:
$redis = Redis.new(:host => 'localhost', :port => 6379, :db => 3)
我的问题是:这个连接是为这个应用程序的所有工作人员共享的,还是每次我使用 $redis 时每个工作线程都会创建自己的连接?
您可以尝试使用 gem connection_pool
,它是任何网络客户端的通用池。
宝石文件:
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
配置/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 对象。当块正常退出或抛出异常时,它将返回到池中。