我使用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超时,除非它在几秒钟后超时。
这里有什么我可能遗失的吗?我应该将比赛分成两个较小的比赛吗?有没有办法更改默认超时间隔?
答案 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值的数组。当至少有一个值是整数时,我遇到了与你相同的问题。 可能你所说的“后端”会将演员阵容变为弦乐,而你的前端则不会。看一看。