web-dev-qa-db-ja.com

Python-Redisサーバーが利用可能かどうかを確認する方法

私はRedis ServerにアクセスするためのPython Service(Class)を開発しています。RedisServerが実行中かどうかを確認する方法を知りたいです。また、どういうわけか接続できない場合それに。

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

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.

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

23
Kartik Rokde

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

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

  1. インスタンス化時に接続を確認する
  2. リクエストを行う際に接続性がない場合に例外ハンドラを書く
28
Lloyd Moore

ここにはすでに良い解決策がありますが、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例外の基本クラスです。

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

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

14
Kasapo

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

try:
    response = rs.client_list()
except redis.ConnectionError:
    #your error handlig code here    
14
Catalin Luta

起動時にredis接続を1回テストする場合は、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()は接続をチェックし、無効な場合は例外を発生させます。

  • 注-テストの実行後も接続が失敗する可能性があるため、後のタイムアウト例外をカバーできません。
9