【问题标题】:Managing connection to redis from Python从 Python 管理与 redis 的连接
【发布时间】:2012-10-09 15:30:54
【问题描述】:

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

在阅读了一些基础教程后,我使用 Redis 类创建了连接,但还没有找到关闭连接的方法,因为这是我第一次使用 Redis。我不确定我是否使用了管理连接的最佳方法,所以我想对此提出一些建议。 这就是我现在 setting 或 getting 变量的方式:

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


    【解决方案1】:

    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 创建连接池吗?
    • 这可能是因为此答案所指的 redis.py 版本较旧,但目前 redis.py 将为您设置一个连接池。无需明确地这样做。
    • #redis 上的一些人认为,如果不经常使用,维护连接池的成本比产生新连接的成本更高。
    【解决方案2】:

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

    通过连接池,您可以创建任意数量的连接,只需使用来自redis-py docsget_connection()release()

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

    【讨论】:

    • AFAIK 连接池会自动创建,无论您是否明确指定。对于我从源代码github.com/andymccurdy/redis-py/blob/master/redis/… 中可以看到的情况确实如此
    • @r_black,你是对的。这意味着,如果您多次创建redis.Redis,它将创建多个连接池。如果您提供connection_pool,那么它会使用它,因此您只有一个连接。
    【解决方案3】:

    你可以用它在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)
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 2019-02-23
      • 2012-11-06
      • 1970-01-01
      • 2021-11-03
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多