Python – Cómo verificar si el servidor Redis está disponible

Estoy desarrollando un Servicio Python (Clase) para acceder a Redis Server. Quiero saber cómo verificar si Redis Server se está ejecutando o no. Y también si de alguna manera no puedo conectarme a él.

Aquí hay una parte de mi código.

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

Imprime lo siguiente

  

incluso si mi Redis Server no se está ejecutando.

Como descubrí que mi Código Python se conecta al Servidor solo cuando hago un set () o get () con mi instancia redis.

Así que no quiero que otros servicios que usan mi clase obtengan un dicho de excepción

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

Quiero devolver el mensaje correcto / código de error. ¿¿Cómo puedo hacer eso??

La forma oficial de verificar si la disponibilidad del servidor redis es ping ( http://redis.io/topics/quickstart ).

Una solución es hacer una subclase de redis y hacer 2 cosas:

  1. Compruebe si hay una conexión en la instanciación
  2. escriba un controlador de excepciones en el caso de que no haya conectividad al realizar solicitudes

Como ha dicho, la conexión con el servidor Redis solo se establece cuando intenta ejecutar un comando en el servidor. Si no desea avanzar sin verificar que el servidor esté disponible, puede enviar una consulta aleatoria al servidor y verificar la respuesta. Algo como :

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

Ya hay buenas soluciones aquí, pero aquí está mi rápida y sucia para django_redis que no parece incluir una función de ping (aunque estoy usando una versión anterior de django y no puedo usar la versión más reciente de 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 

Esto parece funcionar bien. Tenga en cuenta que si redis se está reiniciando y todavía está cargando el archivo .rdb que contiene las entradas de la caché en el disco, entonces lanzará el BusyLoadingError, aunque su clase base es ConnectionError, por lo que está bien capturarlo.

También puede simplemente excepto en redis.exceptions.RedisError que es la clase base de todas las excepciones de redis.

Otra opción, según sus necesidades, es crear funciones de obtención y configuración que detecten las excepciones de ConnectionError al establecer / obtener valores. Luego puede continuar o esperar o lo que sea que necesite hacer (generar una nueva excepción o simplemente lanzar un mensaje de error más útil).

Esto podría no funcionar bien si depende absolutamente de la configuración / obtención de los valores de la memoria caché (para mis propósitos, si la memoria caché está fuera de línea para cualquier cosa que generalmente tengamos que “continuar”), en cuyo caso podría tener sentido tener las excepciones y dejar que program / script die y devuelva el servidor / servicio redis a un estado accesible.

Puede usar el comando ping para verificar si la conexión está activa …

..pero la conexión puede fallar después de la verificación, por lo que no se eliminarán las excepciones de ConnectionError. Si solo desea verificar una vez al inicio, hacer ping es una buena manera de hacerlo.