42

Redis サーバーにアクセスするための Python サービス (クラス) を開発しています。Redis サーバーが稼働しているかどうかを確認する方法を知りたいです。また、どういうわけか私がそれに接続できない場合。

ここに私のコードの一部があります

import redis
rs = redis.Redis("localhost")
print rs

以下を出力します

<redis.client.Redis object at 0x120ba50>

Redis サーバーが実行されていなくても。

私のPythonコードは、redisインスタンスでset()またはget()を実行した場合にのみサーバーに接続することがわかりました。

だから私は自分のクラスを使用している他のサービスが例外を取得したくない

redis.exceptions.ConnectionError: Error 111 connecting localhost:6379. Connection refused.

適切なメッセージ/エラー コードを返したい。どうやってやるの??

4

7 に答える 7

35

Redis サーバーの可用性を確認する公式の方法は ping です ( http://redis.io/topics/quickstart )。

1 つの解決策は、redis をサブクラス化し、次の 2 つのことを行うことです。

  1. インスタンス化時に接続を確認する
  2. リクエストを行うときに接続がない場合の例外ハンドラを書く
于 2012-10-19T06:38:54.383 に答える
30

起動時に一度 redis 接続をテストしたい場合は、ping()コマンドを使用します。

from redis import Redis

redis_host = '127.0.0.1'
r = Redis(redis_host, socket_connect_timeout=1) # short timeout for the test

r.ping() 

print('connected to redis "{}"'.format(redis_host)) 

コマンドping()は接続をチェックし、無効な場合は例外が発生します。

  • 注 - テストを実行した後も接続が失敗する可能性があるため、後のタイムアウト例外をカバーすることはできません。
于 2012-10-12T13:23:26.200 に答える
18

おっしゃるように、Redisサーバーへの接続は、サーバーでコマンドを実行しようとしたときにのみ確立されます。サーバーが使用可能であることを確認せずに先に進みたくない場合は、サーバーにランダムなクエリを送信して応答を確認するだけです。何かのようなもの :

try:
    response = rs.client_list()
except redis.ConnectionError:
    #your error handlig code here    
于 2012-10-12T13:37:11.523 に答える
14

ここにはすでに良い解決策がありますが、ping機能が含まれていないように見えるdjango_redisの簡単で汚いものを次に示します(ただし、古いバージョンのdjangoを使用しているため、最新のdjango_redisは使用できません)。

# assuming rs is your redis connection
def is_redis_available():
    # ... get redis connection here, or pass it in. up to you.
    try:
        rs.get(None)  # getting None returns None or throws an exception
    except (redis.exceptions.ConnectionError, 
            redis.exceptions.BusyLoadingError):
        return False
    return True

これはうまくいくようです。redis が再起動し、ディスク上のキャッシュ エントリを保持する .rdb ファイルをまだロードしている場合、BusyLoadingError がスローされることに注意してください。ただし、基本クラスは ConnectionError であるため、それをキャッチするだけで問題ありません。

redis.exceptions.RedisErrorまた、すべての redis 例外の基本クラスであるon を単純に除外することもできます。

別のオプションは、必要に応じて、値の設定/取得時に ConnectionError 例外をキャッチする get および set 関数を作成することです。次に、続行するか、待機するか、必要なことは何でもできます (新しい例外を発生させるか、より有用なエラー メッセージをスローするだけです)。

キャッシュ値の設定/取得に完全に依存している場合 (私の目的では、一般的に「続行」する必要があるためにキャッシュがオフラインになっている場合)、これはうまく機能しない可能性があります。プログラム/スクリプトが停止し、redis サーバー/サービスを到達可能な状態に戻します。

于 2015-07-23T20:41:52.950 に答える