Python - Как проверить, доступен ли сервер Redis
Я разрабатываю Python Service (класс) для доступа к Redis Server. Я хочу знать, как проверить, работает Redis Server или нет. А также, если каким-то образом я не смогу подключиться к нему.
Вот часть моего кода
import redis
rs = redis.Redis("localhost")
print rs
Он печатает следующие
<redis.client.Redis object at 0x120ba50>
даже если мой сервер Redis не запущен.
Как я понял, мой код Python подключается к Серверу только тогда, когда я делаю set() или get() с моим экземпляром redis.
Поэтому я не хочу, чтобы другие службы, использующие мой класс, получали сообщение об исключении
redis.exceptions.ConnectionError: Error 111 connecting localhost:6379. Connection refused.
Я хочу вернуть правильное сообщение/код ошибки. Как я могу это сделать?
Ответы
Ответ 1
Официальный способ проверки доступности сервера redis на сервере (http://redis.io/topics/quickstart).
Одно из решений заключается в подклассе redis и выполняет 2 вещи:
- проверить соединение при создании экземпляра
- записывать обработчик исключений в случае отсутствия связи при выполнении запросов
Ответ 2
Как вы сказали, соединение с Redis Server устанавливается только при попытке выполнить команду на сервере. Если вы не хотите идти вперед, не проверяя, что сервер доступен, вы можете просто отправить случайный запрос на сервер и проверить ответ. Что-то вроде:
try:
response = rs.client_list()
except redis.ConnectionError:
#your error handlig code here
Ответ 3
Здесь уже есть хорошие решения, но здесь мой быстрый и грязный для django_redis, который, кажется, не включает функцию ping (хотя я использую более старую версию 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.
Другой вариант, в зависимости от ваших потребностей, заключается в создании функций get и set, которые улавливают исключения ConnectionError при настройке/получении значений. Затем вы можете продолжать или ждать или что-то еще, что вам нужно сделать (поднять новое исключение или просто выбросить более полезное сообщение об ошибке).
Это может не сработать, если вы абсолютно зависите от установки/получения значений кеша (для моих целей, если кеш отключен для всех, что мы обычно должны "продолжать" ), и в этом случае имеет смысл иметь исключения и пусть программа / script умрет и вернет сервер/службу redis в состояние достижимости.
Ответ 4
Если вы хотите проверить соединение 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()
проверяет соединение и, если оно неверно, выдаст исключение.
- Примечание. После выполнения теста соединение может все еще не установиться, поэтому оно не покрывает последующие исключения тайм-аута.