Redis hmget超时

时间:2011-11-23 03:56:12

标签: ruby-on-rails performance redis

我使用REDIS.hmget匹配一堆字符串。完整的商店有大约约140k的钥匙。我已经看到我的后端匹配超过1k字符串不到1秒,但我遇到了这个特殊情况,匹配在完成之前超时。我得到了跟踪崩溃的痕迹:

Errno::ETIMEDOUT: Connection timed out
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/connection/ruby.rb:58:in `write'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/connection/ruby.rb:58:in `write'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:139:in `process'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:138:in `each'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:138:in `process'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:250:in `ensure_connected'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:137:in `process'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:206:in `logging'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:136:in `process'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis/client.rb:46:in `call'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis.rb:755:in `hmget'
/usr/ruby1.8.7/lib/ruby/1.8/monitor.rb:242:in `synchronize'
.bundle/gems/ruby/1.8/gems/redis-2.2.2/lib/redis.rb:754:in `hmget'

虽然它超时,但hmget仍然返回到目前为止匹配的内容,这似乎在2到2.3k字符串之间变化。就像我之前说过的那样,我看到后端在不到1秒的时间内匹配1k个字符串,所以我很难设想2.3k字符串会使Redis超时,除非它在几秒钟后超时。

这里有什么我可能遗失的吗?我应该将比赛分成两个较小的比赛吗?有没有办法更改默认超时间隔?

2 个答案:

答案 0 :(得分:1)

我最后小批量地分割查找并且从那以后就没有问题了。类似的东西:

BATCH_MATCHING_COUNT = 1000
values = Array.new
i = 0

while i < keys.length
    values.push(REDIS.hmget("hash", *keys[h, BATCH_MATCHING_COUNT]))
    i+=1
end

答案 1 :(得分:0)

我在使用相同的问题但在PHP中找到了这个问题。我发现将键转换为字符串解决了这个问题。这是你调用Redis :: hmGet(hash,keys)的时候;键应该是STRING值的数组。当至少有一个值是整数时,我遇到了与你相同的问题。 可能你所说的“后端”会将演员阵容变为弦乐,而你的前端则不会。看一看。