私は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.
適切なメッセージ/エラーコードを返したい。どうやってやるの??
Redisサーバーの可用性がpingであるかどうかを確認する公式の方法( http://redis.io/topics/quickstart )。
1つの解決策は、redisをサブクラス化し、2つのことを行うことです。
ここにはすでに良い解決策がありますが、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サーバー/サービスを到達可能な状態に戻します。
前に述べたように、Redisサーバーへの接続は、サーバーでコマンドを実行しようとしたときにのみ確立されます。サーバーが使用可能であることを確認せずに先に進みたくない場合は、サーバーにランダムクエリを送信して応答を確認するだけです。何かのようなもの :
try:
response = rs.client_list()
except redis.ConnectionError:
#your error handlig code here
起動時に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()
は接続をチェックし、無効な場合は例外を発生させます。