无法挽救Redis连接拒绝

Car*_*auf 7 ruby redis

我试图编写一个尝试使用默认TCP设置连接到Redis的函数,如果失败,尝试通过unix套接字连接到Redis.我的意图是有一个适用于我所有系统的连接脚本,其中一些使用TCP,另一些使用套接字.

但是,我似乎无法从失败的TCP连接中解救出来.这是我的测试脚本.

require "redis"

def r
  begin
    $redis ||= Redis.new
  rescue
    $redis = Redis.new(:path => "/tmp/redis.sock")
  end
end

puts "You have #{r.keys.count} redis keys"
Run Code Online (Sandbox Code Playgroud)

rescue块永远不会被执行,而是引发异常.这是此脚本的输出.

/usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:236:in `rescue in establish_connection': Connection refused - Unable to connect to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:222:in `establish_connection'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:23:in `connect'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:247:in `ensure_connected'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:137:in `block in process'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:206:in `logging'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:136:in `process'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:46:in `call'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis.rb:246:in `block in keys'
    from /usr/local/rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
    from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis.rb:245:in `keys'
    from scripts/redis.rb:11:in `<main>'

我已经验证了Redis.new(:path => "/tmp/redis.sock")按预期工作.我试图通过使用我的救援块来更具体,rescue Errno::ECONNREFUSED但无济于事.我不知道为什么我不能抓住这个例外.

有任何想法吗?

Car*_*auf 5

事实证明,调用时不会抛出异常Redis.new.在Redis#keys调用连接对象上的某些方法(在本例中为)之前,不会抛出异常.这个修改过的连接函数似乎可以解决问题.

require "redis"

def r
  begin
    $redis ||= Redis.new
    $redis.inspect # needed to know if connection failed
  rescue
    $redis = Redis.new(:path => "/tmp/redis.sock")
  end
  $redis
end
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个陈旧的答案,但只是为了解释为什么会发生这种情况.Redis连接是延迟加载的,因此在您发出第一个命令之前不会连接. (4认同)