使用Python管理与Redis的连接

51

我在我的Python应用程序中使用redis-py将简单的变量或变量列表存储在Redis数据库中,因此我认为最好在需要保存或检索变量时每次创建到redis服务器的连接,因为这不经常发生且我不想拥有一个会超时的永久连接。

阅读了一些基本教程后,我使用Redis类创建了连接,但是没有找到关闭连接的方法,因为这是我第一次使用Redis。我不确定我是否使用了管理连接的最佳方法,所以我希望能得到一些建议。 现在,这是我进行setget一个变量的方式:

import redis

def getVariable(variable_name):
    my_server = redis.Redis("10.0.0.1")
    response = my_server.get(variable_name)
    return response

def setVariable(variable_name, variable_value):
    my_server = redis.Redis("10.0.0.1")
    my_server.set(variable_name, variable_value)

我基本上使用这段代码来存储最后的连接时间,或者获取请求每秒完成到我的应用程序等等。

感谢您的建议。

3个回答

80

Python使用引用计数机制来处理对象,因此在块的末尾,my_server对象将被自动销毁,连接也会关闭。您不需要显式关闭它。

现在这不是您应该管理Redis连接的方式。每次操作都进行连接/断开连接太昂贵了,因此最好保持连接处于打开状态。使用redis-py可以通过声明连接池来实现:

import redis

POOL = redis.ConnectionPool(host='10.0.0.1', port=6379, db=0)

def getVariable(variable_name):
    my_server = redis.Redis(connection_pool=POOL)
    response = my_server.get(variable_name)
    return response

def setVariable(variable_name, variable_value):
    my_server = redis.Redis(connection_pool=POOL)
    my_server.set(variable_name, variable_value)

请注意,连接池管理在redis-py内部通常是自动完成的。


谢谢,我不知道这个。但是如果我创建了连接池,当我离开这个模块时,我是否有一种方法来关闭它,或者这不是必要的? - jeruki
2
Python会在脚本结束时销毁对POOL对象的最后一个引用并关闭连接。 - Didier Spezia
我正在使用服务器环境中的URL连接到Redis。我使用redis.from_url(ENV['MYSERVER_REDIS_URL'],0)。我没有找到任何ConnectionPool.from_url()方法。你知道如何从URL创建连接池吗? - Guillaume Gendre
使用urlparse函数解析URL并提取连接参数,就像在https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L236中所做的那样。 - Didier Spezia
9
可能是因为此回答所引用的redis.py版本较旧,但目前的redis.py会为您设置一个连接池,无需明确执行该操作。 - pors
1
一些关于 #redis 的人认为,如果使用不是很频繁,维护连接池的成本比生成新连接更高。 - dman

4

@sg1990如果有10,000个用户同时需要使用redis,那该怎么办?他们不能共享一个连接,您刚刚创建了瓶颈。

通过连接池,您可以创建任意数量的连接,并且只需使用get_connection()release(),详见redis-py文档

为每个用户创建一个连接是极其浪费的,因为每个连接都需要维护一个开放的套接字。这样做将自动减少例如并发websocket用户数等,使得您的机器可以处理的用户数减半。


1
据我所知,连接池会自动创建,无论您是否明确指定。从源代码 https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493 可以看出这一点是正确的。 - r_black
1
@r_black,你是正确的。这意味着,如果你多次创建redis.Redis,它将创建多个连接池。如果你提供了connection_pool,那么它会使用它,这样你就只有一个连接。 - Shiplu Mokaddim

-2

你可以使用这个来在Redis中创建两个数据库:

    r1  = redis.StrictRedis(host="localhost", port=6379, db=0, decode_responses=True)
    r2  = redis.StrictRedis(host="localhost", port=6379, db=1, decode_responses=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接