2013-06-20 42 views
0

所以redis gem应该是线程安全的,这很好。但我想知道我需要如何设置它。我正在使用jRuby和赛璐珞(使用默认光纤)。在jruby线程安装中使用redis

我使用它现在的方式是我定义的全局方法:

def redis 
    @_redis ||= Redis.new(...) 
end 

我对Redis的客户端设置为30。超时参数,我不认为有任何thread-安全问题对我来说(我初始化它之前产卵线程),但是有时我开始得到Redis :: TimeoutError错误,所以我想知道如果这些线程可能永远保持打开连接,并最终占用所有可用那些?

基本上问题是,有时我会得到Redis :: TimeoutError。有什么方法可以检查哪些连接在某个时间打开?或者有什么想法可能是什么问题?

感谢

+0

任何解决这么远? – leifg

+0

不幸的是,还有这个问题.. – mrbrdo

回答

1

这里的问题就是,Redis的客户端锁独占(您可以通过测量,它需要一个命令为1,2,3等。线程的时间验证,它最有可能是线性的)。

解决办法有两个位置:

  1. 创建每个线程新的客户端(注意它会让你有很多的打开的文件和长期运行过程中,它会杀死你的机器)
  2. 实现连接池,
  3. 使用this gem作为连接池(我没有测试它尚未)