Python - 如何检查Redis服务器是否可用

Kar*_*kde 27 python redis

我正在开发一个用于访问Redis Server的Python服务(类).我想知道如何检查Redis Server是否正在运行.而且如果不知何故我无法连接到它.

这是我的代码的一部分

import redis
rs = redis.Redis("localhost")
print rs
Run Code Online (Sandbox Code Playgroud)

它打印以下内容

<redis.client.Redis object at 0x120ba50>
Run Code Online (Sandbox Code Playgroud)

即使我的Redis服务器没有运行.

当我发现我的Python代码仅在我使用redis实例执行set()get()时才连接到Server .

因此,我不希望使用我的类的其他服务获得异常说法

redis.exceptions.ConnectionError: Error 111 connecting localhost:6379. Connection refused.
Run Code Online (Sandbox Code Playgroud)

我想返回正确的消息/错误代码.我怎样才能做到这一点??

Llo*_*ore 29

检查redis服务器可用性是否为ping的官方方法(http://redis.io/topics/quickstart).

一种解决方案是将redis子类化并做两件事:

  1. 在实例化时检查连接
  2. 在发出请求时,如果没有连接,则编写异常处理程序


Cat*_*uta 16

如上所述,只有在尝试在服务器上执行命令时,才会建立与Redis服务器的连接.如果您不想在没有检查服务器可用的情况下前进,您可以向服务器发送随机查询并检查响应.就像是 :

try:
    response = rs.client_list()
except redis.ConnectionError:
    #your error handlig code here    
Run Code Online (Sandbox Code Playgroud)

  • `rs.ping()`会更好,对吧? (3认同)
  • 您应该为此真正使用PING命令。 (2认同)

Kas*_*apo 14

这里已经有了很好的解决方案,但这里是我的快速和脏的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
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好.请注意,如果redis正在重新启动并仍然加载保存磁盘上缓存条目的.rdb文件,那么它将抛出BusyLoadingError,尽管它的基类是ConnectionError,因此可以捕获它.

您也可以简单地除了redis.exceptions.RedisError所有redis异常的基类.

根据您的需要,另一个选项是创建get和set函数,以便在设置/获取值时捕获ConnectionError异常.然后你可以继续或等待或者你需要做什么(引发一个新的异常或者只是抛出一个更有用的错误信息).

如果你完全依赖于设置/获取缓存值(对于我的目的,如果缓存离线,我们通常必须"继续"),这可能不会很好.在这种情况下,拥有异常可能是有意义的,并让程序/脚本死掉并将redis服务器/服务恢复到可达状态.


Sri*_*nan 12

您可以使用该ping()命令检查连接是否处于活动状态....

..但是检查后连接仍然可能失败,因此您不会消除ConnectionError异常.如果您只想在启动时检查一次,那么这ping()是一个很好的方法.


hex*_*are 12

ConnectionRefusedError当 redis 未运行时,我还遇到了来自套接字库的问题,因此我必须将其添加到可用性检查中。

r = redis.Redis(host='localhost',port=6379,db=0)

def is_redis_available(r):
    try:
        r.ping()
        print("Successfully connected to redis")
    except (redis.exceptions.ConnectionError, ConnectionRefusedError):
        print("Redis connection error!")
        return False
    return True

if is_redis_available(r):
    print("Yay!")
Run Code Online (Sandbox Code Playgroud)


Aka*_*jan 8

可以通过对服务器执行 ping 命令来检查 Redis 服务器连接。

>>> import redis
>>> r = redis.Redis(host="127.0.0.1", port="6379")
>>> r.ping()
True
Run Code Online (Sandbox Code Playgroud)

使用该ping方法,我们可以处理重新连接等。为了了解连接错误的原因,可以按照其他答案中的建议使用异常处理。

try:
    is_connected = r.ping()
except redis.ConnectionError:
    # handle error
Run Code Online (Sandbox Code Playgroud)


Yog*_*dav 5

使用 ping()

from redis import Redis

conn_pool = Redis(redis_host)
# Connection=Redis<ConnectionPool<Connection<host=localhost,port=6379,db=0>>>

try:
    conn_pool.ping()
    print('Successfully connected to redis')
except redis.exceptions.ConnectionError as r_con_error:
    print('Redis connection error')
    # handle exception
Run Code Online (Sandbox Code Playgroud)