Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Redis hmget超时_Ruby On Rails_Performance_Redis - Fatal编程技术网

Ruby on rails Redis hmget超时

Ruby on rails Redis hmget超时,ruby-on-rails,performance,redis,Ruby On Rails,Performance,Redis,我正在使用REDIS.hmget匹配一组字符串。整个商店大约有140k把钥匙。我已经看到我的后端在不到1s的时间内匹配超过1k个字符串,但我遇到了这个特殊情况,匹配在完成之前超时。我得到以下崩溃跟踪: 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/r

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

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超时,除非它只在几秒钟后超时


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

我在处理同一问题时发现了这个问题,但是在PHP中。我发现,将关键点放在弦上解决了这个问题。这就是调用Redis::hmGet(散列,键)的时候;键应该是字符串值的数组。当至少有一个值是整数时,我的问题与您的问题相同。
可能您称之为“后端”的内容会转换为字符串,而您的前端则不会。请看一看。

我最终将查找分为小批量,从那以后就没有问题了。比如:

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
BATCH\u MATCHING\u COUNT=1000
values=Array.new
i=0
而我的长度
push(REDIS.hmget(“hash”,*键[h,批处理匹配计数])
i+=1
结束

我确认
键是字符串数组。此外,如果这是一个问题,它将是可复制的,而现在它只是任意超时时,有超过1-2k键。