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

时间:2012-10-12 10:59:52

标签: python redis

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

这是我的代码的一部分

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

打印以下内容

<redis.client.Redis object at 0x120ba50>

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

我发现只有当我使用我的redis实例执行 set() get()时,我的Python代码才会连接到服务器。

所以我不希望使用我的类的其他服务获得一个Exception说

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

我想返回正确的消息/错误代码。我怎么能这样做?

7 个答案:

答案 0 :(得分:28)

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

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

  1. 检查实例化时的连接
  2. 在发出请求时没有连接的情况下编写异常处理程序

答案 1 :(得分:14)

这里已经有了很好的解决方案,但是这里我的django_redis快速而肮脏,它似乎不包含ping功能(虽然我使用的是旧版本的django并且可以&# 39;使用最新的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异常。然后你可以继续或等待或者你需要做什么(引发一个新的异常或者只是抛出一个更有用的错误信息)。

如果您完全依赖于设置/获取缓存值(对于我的目的,如果缓存离线以用于我们通常需要的任何内容,那么这可能不会很好)#34;继续进行&#34;)在这种情况下它可能会使感觉有例外,让程序/脚本死掉,让redis服务器/服务恢复到可达状态。

答案 2 :(得分:13)

正如您所说,只有当您尝试在服务器上执行命令时,才会建立与Redis服务器的连接。如果您不想在没有检查服务器可用的情况下前进,您可以向服务器发送随机查询并检查响应。类似的东西:

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:1)

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

>>> import redis
>>> r = redis.Redis(host="127.0.0.1", port="6379")
>>> r.ping()
True

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

try:
    is_connected = r.ping()
except redis.ConnectionError:
    # handle error

答案 5 :(得分:0)

使用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

答案 6 :(得分:0)

当redis未运行时,我还从套接字库中遇到了ConnectionRefusedError,因此我不得不将其添加到可用性检查中。

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!")