Redis
 sql >> база данни >  >> NoSQL >> Redis

Време за изчакване на спасяване::Грешка от Redis Gem (Ruby)

Пуснахте този код в irb, нали? Изключението, което получавате, всъщност не е издигнато от Redis.new . То се повдига от inspect метод, който irb извиква, за да ви покаже стойността на току-що въведения израз.

Просто погледнете трасето на стека (съкратих пътищата, за да стане четливо):

ruby-1.8.7-p330 :009 >   Redis.new(:host => "google.com")
Timeout::Error: time's up!
    from /.../SystemTimer-1.2.3/lib/system_timer/concurrent_timer_pool.rb:63:in `trigger_next_expired_timer_at'
    from /.../SystemTimer-1.2.3/lib/system_timer/concurrent_timer_pool.rb:68:in `trigger_next_expired_timer'
    from /.../SystemTimer-1.2.3/lib/system_timer.rb:85:in `install_ruby_sigalrm_handler'
    from /..../lib/ruby/1.8/monitor.rb:242:in `synchronize'
    from /.../SystemTimer-1.2.3/lib/system_timer.rb:83:in `install_ruby_sigalrm_handler'
    from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `call'
    from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `initialize'
    from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `new'
    from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `connect'
    from /.../SystemTimer-1.2.3/lib/system_timer.rb:60:in `timeout_after'
    from /.../redis-2.2.2/lib/redis/connection/ruby.rb:115:in `with_timeout'
    from /.../redis-2.2.2/lib/redis/connection/ruby.rb:25:in `connect'
    from /.../redis-2.2.2/lib/redis/client.rb:227:in `establish_connection'
    from /.../redis-2.2.2/lib/redis/client.rb:23:in `connect'
    from /.../redis-2.2.2/lib/redis/client.rb:247:in `ensure_connected'
    from /.../redis-2.2.2/lib/redis/client.rb:137:in `process'
... 2 levels...
    from /.../redis-2.2.2/lib/redis/client.rb:46:in `call'
    from /.../redis-2.2.2/lib/redis.rb:90:in `info'
    from /..../lib/ruby/1.8/monitor.rb:242:in `synchronize'
    from /.../redis-2.2.2/lib/redis.rb:89:in `info'
    from /.../redis-2.2.2/lib/redis.rb:1075:in `inspect'
    from /..../lib/ruby/1.8/monitor.rb:242:in `synchronize'
    from /.../redis-2.2.2/lib/redis.rb:1074:in `inspect'
    from /..../lib/ruby/1.8/irb.rb:310:in `output_value'
    from /..../lib/ruby/1.8/irb.rb:159:in `eval_input'
    from /..../lib/ruby/1.8/irb.rb:271:in `signal_status'
    from /..../lib/ruby/1.8/irb.rb:155:in `eval_input'
    from /..../lib/ruby/1.8/irb.rb:154:in `eval_input'
    from /..../lib/ruby/1.8/irb.rb:71:in `start'
    from /..../lib/ruby/1.8/irb.rb:70:in `catch'
    from /..../lib/ruby/1.8/irb.rb:70:in `start'
    from /..../bin/irb:17

Както можете да видите по-горе, изключението възниква вътре в inspect , а не Redis.new . Когато извикате inspect върху обект Redis, вместо просто да отпечатва състоянието му, той всъщност прави много неща. В този случай inspect се опитва да се свърже със сървъра и хвърля изключение, когато това изтече. Това ми се струва много лош дизайн и може би трябва да подадем доклад за грешка до поддържащите скъпоценния камък Redis.

Това води до интересно поведение в IRB:

  • Въвеждане на Redis.new(:host => "google.com") води до изключение, както е показано по-горе
  • Напишете Redis.new(:host => "google.com"); 'hello' води до '=> "hello" '

Ако искате да хванете това изключение, опитайте да извикате ensure_connected във вашия начален/спасителен/краен блок.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да се свърже с redis чрез jedis

  2. Sidekiq не намира записи за Rails Active Job

  3. Ruby - Redis базиран мютекс с изпълнение на изтичане

  4. Как да получа ключа от стойност в двойка ключ/стойност в клиент на магазина на redis?

  5. Как да внедря Redis Cache с Django Rest Framework?