使用redis时spork rspec,引发Redis :: InheritedError

时间:2013-04-12 06:41:35

标签: rspec redis spork

如果代码执行redis相关功能,则会引发

  

Redis :: InheritedError:尝试使用子进程的连接而不重新连接。您需要在分叉后重新连接到Redis。

当redis连接时,它会将spork process.pid保存为@pid,然后redis excute它会使用ensure_connected检查连接,这将通过Process.pid != @pid进行检查。并且这两个pid是不同的,因此它引发了Redis :: InheritedError。

谷歌,

Resque.after_fork do 
  Resque.redis.client.reconnect
end

并重新连接每个规范的redis客户端

它们都不适合我。

3 个答案:

答案 0 :(得分:1)

我在这里找到了解决方案,它对我有用:Hacki.ly

看起来这是在spec_helper.rb中添加以下内容的问题:

RSpec.configure do |config| 
  # ... 
  config.before :all do
    $redis.client.reconnect 
  end 
  # ... 
end

您可能需要将$redis更改为您正在使用的任何内容,以获取对Redis实例的引用。

答案 1 :(得分:0)

将redis升级到2.6.12后,问题解决了。

答案 2 :(得分:0)

我能够通过在spec_helper.rb中添加以下内容来解决这个问题:

Spork.each_run do
  $redis.client.reconnect
end

同样如Gabe的回答所述,您可能需要将$redis更改为您正在使用的任何内容,以获取对Redis实例的引用。