Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Limit czasu na ratunek::Błąd z Redis Gem (Ruby)

Uruchomiłeś ten kod w irb, prawda? Wyjątek, który otrzymujesz, nie jest w rzeczywistości zgłaszany przez Redis.new . Jest zgłaszany przez inspect metodę, którą irb wywołuje, aby pokazać wartość wyrażenia, które właśnie wpisałeś.

Wystarczy spojrzeć na ślad stosu (skróciłem ścieżki, aby był czytelny):

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

Jak widać powyżej, wyjątek występuje wewnątrz inspect , a nie Redis.new . Kiedy dzwonisz inspect na obiekcie Redis, zamiast po prostu drukować jego stan, robi wiele rzeczy. W takim przypadku inspect próbuje połączyć się z serwerem i zgłasza wyjątek po przekroczeniu limitu czasu. Wydaje mi się to bardzo złym projektem i być może powinniśmy zgłosić błąd opiekunom klejnotu Redis.

Prowadzi to do interesującego zachowania w IRB:

  • Wpisz Redis.new(:host => "google.com") powoduje wyjątek, jak pokazano powyżej
  • Wpisywanie Redis.new(:host => "google.com"); 'hello' wyniki w '=> "hello" '

Jeśli chcesz złapać ten wyjątek, spróbuj wywołać ensure_connected wewnątrz bloku początku/ratunku/końca.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak utworzyć fasolę FindByIndexNameSessionRepository

  2. Jak atomowo usunąć klucze pasujące do wzorca za pomocą Redis

  3. Ponowna próba połączenia klienta Redis węzła JS

  4. Redis nie aktualizuje się, gdy wiele żądań naraz

  5. Jak zaprojektować redis pub/sub dla systemu wiadomości błyskawicznych?