无法从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"

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对我的救援块进行更具体的描述,但无济于事。 我不知道为什么我无法捕捉到这个例外。

有任何想法吗?


事实证明,调用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

我发现$redis.inspect并没有实际运用REDIS连接。 我用$redis.keys替换它,并正确抛出异常。 请注意,我在Heroko运行,并且传入环境变量REDISTOGO_URL 。 然后我在整个应用程序中使用一个不断的REDIS

在我的config / initializers / redis.rb中:

uri = URI.parse(ENV['REDISTOGO_URL'])
begin
  redis ||= Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
  redis.keys # needed to know if connection failed
  REDIS = redis
rescue
  puts("Redis not loaded on #{uri.port}")
  REDIS = nil
end
链接地址: http://www.djcxy.com/p/38787.html

上一篇: Unable to rescue from Redis connection refusal

下一篇: Ruby on Rails. Bundler. Cucumber. rake aborted! Command failed with status (1)