2011-11-23 3 views
2

REDIS.hmget을 사용하는 문자열 묶음과 일치합니다. 풀 스토어에는 약 140,000 개의 키가 있습니다. 나는 1k 미만의 문자열에서 백엔드와의 매칭을 보았지만, 매칭 타임이 끝나기 전에이 특별한 경우를 보게되었다. 나는 다음과 충돌 추적을 얻을 :Redis hmget timeout

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 개의 작은 경기로 나눠야하나요? 기본 타임 아웃 간격을 변경하는 방법이 있습니까?

답변

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 
0

동일한 문제가 있지만 PHP에서 작업하는 동안이 질문을 발견했습니다. 문자열에 키를 캐스팅하면 문제가 해결된다는 것을 발견했습니다. Redis :: hmGet (해시, 키)를 호출하면됩니다. 키는 STRING 값의 배열이어야합니다. 적어도 하나의 값이 정수일 때 나는 당신과 같은 문제가있었습니다. 아마도 "백엔드"라고하는 것은 캐스트를 문자열로 처리하며 프런트 엔드는 그렇지 않습니다. 그걸보세요.

+0

나는'keys'가 문자열 배열임을 확인합니다. 또한, 그것이 문제라면, 그것은 재현 가능할 것입니다. 반면 지금은 1-2k 개의 키가있을 때 임의로 타임 아웃됩니다. – samvermette