Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Waktu Penyelamatan::Kesalahan dari Redis Gem (Ruby)

Anda menjalankan kode ini di irb, bukan? Pengecualian yang Anda dapatkan sebenarnya tidak diajukan oleh Redis.new . Itu dimunculkan oleh inspect metode, yang dipanggil irb untuk menunjukkan nilai ekspresi yang baru saja Anda ketik.

Lihat saja jejak tumpukan (saya mempersingkat jalur agar mudah dibaca):

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

Seperti yang Anda lihat di atas, pengecualian terjadi di dalam inspect , bukan Redis.new . Saat Anda memanggil inspect pada objek Redis, alih-alih hanya mencetak statusnya, ia sebenarnya melakukan banyak hal. Dalam hal ini, inspect mencoba terhubung ke server dan mengeluarkan pengecualian saat waktu itu habis. Ini sepertinya desain yang sangat buruk bagi saya dan mungkin kita harus mengajukan laporan bug ke pengelola permata Redis.

Ini mengarah pada beberapa perilaku menarik di IRB:

  • Mengetik Redis.new(:host => "google.com") menghasilkan pengecualian seperti yang ditunjukkan di atas
  • Mengetik Redis.new(:host => "google.com"); 'hello' menghasilkan '=> "hello" '

Jika Anda ingin mengetahui pengecualian ini, coba panggil ensure_connected di dalam blok awal/penyelamatan/akhir Anda.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. dapatkah beberapa klien mengakses daftar yang sama secara bersamaan tanpa diblokir di Redis?

  2. Redis Bersyarat disetel / hanya memperbarui dengan versi terbaru?

  3. Desain kunci redis untuk aplikasi stok waktu nyata

  4. menyimpan deret waktu di redis

  5. Memasukkan Daftar ke Daftar lain di Redis