Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Hết thời gian chờ giải cứu ::Lỗi từ Redis Gem (Ruby)

Bạn đã chạy mã này trong irb, phải không? Ngoại lệ bạn đang nhận được không thực sự được nêu ra bởi Redis.new . Nó đang được nâng lên bởi inspect phương thức mà irb gọi để hiển thị cho bạn giá trị của biểu thức bạn vừa nhập.

Chỉ cần nhìn vào dấu vết ngăn xếp (tôi đã rút ngắn các đường dẫn để làm cho nó dễ đọc):

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

Như bạn có thể thấy ở trên, ngoại lệ xảy ra bên trong inspect , không phải Redis.new . Khi bạn gọi inspect trên một đối tượng Redis, thay vì chỉ in ra trạng thái của nó, nó thực sự làm rất nhiều thứ. Trong trường hợp này, inspect cố gắng kết nối với máy chủ và ném một ngoại lệ khi điều đó hết thời gian. Đây có vẻ là một thiết kế rất tệ đối với tôi và có lẽ chúng tôi nên gửi báo cáo lỗi cho những người bảo trì viên ngọc Redis.

Điều này dẫn đến một số hành vi thú vị trong IRB:

  • Đang nhập Redis.new(:host => "google.com") dẫn đến một ngoại lệ như được hiển thị ở trên
  • Đang nhập Redis.new(:host => "google.com"); 'hello' kết quả là '=> "hello" '

Nếu bạn muốn biết ngoại lệ này, hãy thử gọi ensure_connected bên trong khối bắt đầu / giải cứu / kết thúc của bạn.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. tiện ích mở rộng phpredis không hoạt động, không thể tải 'redis.so'

  2. Làm thế nào để triển khai Redis Cache với Django Rest Framework?

  3. Redis Nhiều người đăng ký

  4. Dịch vụ Redis

  5. Bộ nhớ đệm khởi động mùa xuân với redis, khóa có \ xac \ xed \ x00 \ x05t \ x00 \ x06