sql >> データベース >  >> NoSQL >> Redis

Rescue Timeout ::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 サーバーへの接続を試み、タイムアウトすると例外をスローします。これは私には非常に悪い設計のように思われるので、Redisgemのメンテナにバグレポートを提出する必要があるかもしれません。

    これにより、IRBでいくつかの興味深い動作が発生します:

    • Redis.new(:host => "google.com")と入力します 上記のように例外が発生します
    • Redis.new(:host => "google.com"); 'hello' 結果は'=> "hello" '

    この例外をキャッチしたい場合は、ensure_connectedを呼び出してみてください 開始/レスキュー/終了ブロック内。




    1. 信頼性のあるRedisPub/ Sub

    2. socket.ioでRedisStoreを使用する例

    3. Redisに参加できますか?

    4. MongoDB2.4.1がScaleGridで利用可能になりました