4

在我的 Rails 应用程序中,我有一个创建 Redis 连接的初始化程序:

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

我的问题是:这个连接是为这个应用程序的所有工作人员共享的,还是每次我使用 $redis 时每个工作线程都会创建自己的连接?

4

1 回答 1

4

您可以尝试使用 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 对象。当块正常退出或抛出异常时,它将返回到池中。

于 2013-09-05T09:51:51.640 回答