2012-10-19 144 views
35

我在我的python应用程序中使用redis-py在Redis数据库中存储简单变量或变量列表,所以我认为最好每次需要时创建一个到redis服务器的连接保存或检索变量,因为这不是经常进行的操作,并且不希望有可能超时的永久连接。从Python管理与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) 

我基本上使用此代码来存储最终连接时间或获得每秒请求的平均做我的应用程序和类似的东西那。

感谢您的建议。

回答

54

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

+0

谢谢我不知道这一点,但如果我创建连接池我有一种方法来关闭它,当我离开这个模块或任何它不是必要的任何方式吗? – jeruki

+2

没有必要。当对POOL对象的最后一个引用将被销毁时(这里在脚本的末尾),Python将关闭连接。 –

+0

非常感谢你这就是我需要知道的 – jeruki

2

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

通过一个连接池,您可以创建任意数量的连接,只需使用get_connection()release(),从redis-py docs即可。

每个用户的连接是一个巨大的矫枉过正,因为每个连接都需要维护一个开放的套接字。这样你会自动减少一些例如并发websocket用户,你的机器可以处理一半。

+0

AFAIK连接池是自动创建的,无论您是否明确指定它。对于我可以从源https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493中看到的情况 –