Rails 中是否共享 Redis 连接?

Hen*_*hiu 5 ruby ruby-on-rails redis

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

$redis = Redis.new(:host => 'localhost', :port => 6379, :db => 3)
Run Code Online (Sandbox Code Playgroud)

我的问题是:此连接是否为该应用程序的所有工作线程共享,或者每个工作线程是否在每次使用 $redis 时创建自己的连接?

Tom*_*art 4

您可以尝试使用 gem connection_pool,它是任何网络客户端的通用池。

宝石文件:

gem 'connection_pool'
Run Code Online (Sandbox Code Playgroud)

初始化程序/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
Run Code Online (Sandbox Code Playgroud)

配置/redis.yml

development:
  host: localhost
  port: 6379
  db: 0
test:
  host: localhost
  port: 6379
  db: 15
production:
  host: localhost
  port: 6379
  db: 0
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中:

Redis.current.with do |conn|
  value = conn.get('foo')
  conn.sadd('bar', 1)
end
Run Code Online (Sandbox Code Playgroud)

with块内,conn将包含池中的 Redis 对象。当块正常退出或由于抛出异常而退出时,它将返回到池中。

  • @Marklar可能在你的模型中(或者你想要访问Redis的任何地方)。块内的代码,变量“conn”表示与 Redis 数据库的一个连接。退出后,块连接将返回到池中,以供其他实例重新使用它。 (2认同)