【问题标题】:Redis hmget timeoutRedis hmget 超时
【发布时间】:2012-01-04 10:40:54
【问题描述】:

我正在使用REDIS.hmget 匹配一堆字符串。完整的商店有大约 140k 键。我已经在不到 1 秒的时间内看到我的后端匹配超过 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 超时,除非它仅在几秒钟后超时。

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

【问题讨论】:

    标签: ruby-on-rails performance redis


    【解决方案1】:

    我在处理同一问题但使用 PHP 时发现了这个问题。我发现将键转换为字符串解决了这个问题。这是你调用 Redis::hmGet(hash, keys) 的时候;键应该是一个字符串值数组。当至少一个值是整数时,我遇到了与您相同的问题。 可能您所谓的“后端”会强制转换为字符串,而您的前端不会。看看那个。

    【讨论】:

    • 我确认keys 是一个字符串数组。此外,如果这是问题所在,它将是可重现的,而现在它只是在有超过 1-2k 个键时任意超时。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-22
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多