在jruby线程设置中使用redis

时间:2013-06-20 11:00:51

标签: ruby redis jruby celluloid

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

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

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

我将Redis客户端的超时参数设置为30.我不认为我有任何线程安全问题(我在生成线程之前将其初始化),但是有时候我开始得到 Redis :: TimeoutError 错误,所以我想知道这些线程是否会永远保持开放连接并最终占用所有可用的连接?

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

由于

1 个答案:

答案 0 :(得分:1)

这里的问题是,redis客户端专门锁定(你可以通过测量1,2,3等线程命令所需的时间来验证它,它很可能是线性的)。

这里有两种解决方案:

  1. 为每个线程创建一个新的客户端(小心它会留下很多打开的文件,对于长时间运行的进程,它会杀死你的机器)
  2. 实施连接池
  3. 使用this gem作为您的连接池(我还没有测试过)