相关文章推荐
慈祥的羊肉串  ·  T(n) = 4T(n / 2) + ...·  1 年前    · 
聪明的手电筒  ·  java - Bad grammar ...·  1 年前    · 

管理从Python到redis的连接

49 人关注

我在我的python应用程序中使用 redis-py 在Redis数据库中存储简单的变量或变量列表,所以我认为在每次需要保存或检索变量时创建一个与Redis服务器的连接会更好,因为这不是经常做的,我不希望有一个永久连接超时。

在阅读了一些基本的教程后,我使用Redis类创建了连接,但没有找到关闭连接的方法,因为这是我第一次使用Redis。我不确定我是否使用了管理连接的最佳方法,所以我想得到一些建议。 这就是我现在 set 设置或 get 设置一个变量的方法。

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)

我基本上是用这段代码来存储最后的连接时间,或者获取每秒对我的应用程序所做请求的平均数,诸如此类。

谢谢你的建议。

python
connection
redis
jeruki
jeruki
发布于 2012-10-19
3 个回答
Didier Spezia
Didier Spezia
发布于 2021-02-14
已采纳
0 人赞同

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内部完成。

谢谢,我不知道这一点,但如果我创建了连接池,当我离开这个模块时,我是否有办法关闭它,还是没有必要?
没有必要。当对POOL对象的最后一个引用将被销毁时,Python将关闭连接 (这里是脚本的结尾处)。
我正在用我的服务器环境中的一个URL连接到redis。我使用 redis.from_url(ENV['MYSERVER_REDIS_URL'],0) 。我没有找到任何ConnectionPool.from_url()方法。你知道如何从一个URL创建一个连接池吗?
pors
这可能是因为这个答案所指的 redis.py 的旧版本,但目前 redis.py 会为你设置一个连接池。不需要明确地这样做。
dman
#redis上的一些人认为,如果使用频率不高,维护连接池的成本比生成新连接的成本要高。
haren
haren
发布于 2021-02-14
0 人赞同

@sg1990 如果你有10.000个用户同时需要redis怎么办?他们不能共享一个连接,你就给自己制造了一个瓶颈。

通过连接池,你可以创建任意数量的连接,并简单地使用 get_connection() release() ,从 redis-py docs .

每个用户一个连接是一个巨大的矫枉过正,因为每个连接都需要保持一个开放的套接字。这样一来,你会自动减少你的机器所能处理的websocket并发用户的数量,例如减少一半。