Python - Как проверить, доступен ли сервер Redis - программирование
Подтвердить что ты не робот

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.

Я хочу вернуть правильное сообщение/код ошибки. Как я могу это сделать?

4b9b3361

Ответ 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() проверяет соединение и, если оно неверно, выдаст исключение.

  • Примечание. После выполнения теста соединение может все еще не установиться, поэтому оно не покрывает последующие исключения тайм-аута.