Redis hmget timeout - PullRequest
       5

Redis hmget timeout

2 голосов
/ 23 ноября 2011

Я сопоставляю несколько строк, используя REDIS.hmget.В полном магазине около 140 тыс. Ключей.Я видел, как мой бэкэнд совпадал со строками 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,3 тыс. СтрокКак я уже говорил ранее, я видел, как бэкэнд совпадал со строками 1k менее чем за 1 секунду, поэтому мне трудно представить, что строки в 2.3k приводят к превышению времени ожидания Redis, если оно не истекло только через пару секунд.

Есть что-нибудь, что я мог бы мне здесь не хватать?Должен ли я разбить матч на 2 меньших?Есть ли способ изменить интервал ожидания по умолчанию?

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

В итоге я разделил поиск на небольшие партии, и с тех пор у меня нет проблем Что-то вроде:

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
0 голосов
/ 29 ноября 2011

Я нашел этот вопрос, работая над той же проблемой, но в PHP.Я обнаружил, что приведение ключей к строке решило проблему.Это когда вы вызываете Redis :: hmGet (hash, keys);ключи должны быть массивом значений STRING.У меня была та же проблема, что и у вас, когда хотя бы одно из значений было целым числом.Вероятно, то, что вы называете "backend", выполняет приведение к строке, а ваш интерфейс - нет.Посмотрите на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...