1

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

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

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

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

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

谢谢

4

1 回答 1

1

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

这里有两种解决方案:

  1. 为每个线程创建一个新客户端(小心它会给你留下很多打开的文件,并且对于长时间运行的进程,它会杀死你的机器)
  2. 实现一个连接池
  3. 使用这个 gem作为你的连接池(我还没有测试过)
于 2013-07-11T09:30:22.660 回答