首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python Redis连接

python Redis连接
EN

Stack Overflow用户
提问于 2012-11-17 23:04:16
回答 2查看 4.8K关注 0票数 5

我使用的是带有python的Redis服务器。

我的应用程序是多线程的(我每个进程使用20 - 32个线程),我还在不同的机器上运行应用程序。

我注意到有时候Redis的cpu使用率是100%,并且Redis服务器变得没有响应/变慢。

我想使用每个应用程序1连接池的4个连接的总数。例如,如果我在最多20台机器上运行我的应用程序,那么应该有20*4 = 80个到redis Server的连接。

代码语言:javascript
复制
POOL = redis.ConnectionPool(max_connections=4, host='192.168.1.1', db=1, port=6379)
R_SERVER = redis.Redis(connection_pool=POOL)

class Worker(Thread):

    def __init__(self):
        self.start()

    def run(self):
        while True:
            key = R_SERVER.randomkey()
            if not key: break
            value = R_SERVER.get(key)


    def _do_something(self, value):
        # do something with value
        pass

if __name__ = '__main__':
    num_threads = 20
    workers = [Worker() for _ in range(num_threads)]
    for w in workers:
       w.join()

当执行一个命令时,上面的代码应该运行从最大大小为4的连接池获得连接的20个线程。

当连接被释放时?

根据此代码(https://github.com/andymccurdy/redis-py/blob/master/redis/client.py):

代码语言:javascript
复制
    #### COMMAND EXECUTION AND PROTOCOL PARSING ####
def execute_command(self, *args, **options):
    "Execute a command and return a parsed response"
    pool = self.connection_pool
    command_name = args[0]
    connection = pool.get_connection(command_name, **options)
    try:
        connection.send_command(*args)
        return self.parse_response(connection, command_name, **options)
    except ConnectionError:
        connection.disconnect()
        connection.send_command(*args)
        return self.parse_response(connection, command_name, **options)
    finally:
        pool.release(connection)

执行每个命令后,连接将被释放并返回池

有没有人能证实我已经正确理解了这个想法,并且上面的示例代码可以像描述的那样工作?

因为当我看到redis连接时,总是超过4个。

编辑:我刚刚注意到在代码中,函数在finally之前有一条return语句。那么最终的目的是什么呢?

EN

回答 2

Stack Overflow用户

发布于 2014-07-21 23:56:43

正如Matthew Scragg提到的,finally子句在测试结束时执行。在这种特殊情况下,它的作用是在连接完成时将其释放回池中,而不是让它保持打开状态。

至于无响应,看看你的服务器在做什么。您的Redis实例的内存限制是多少?您多长时间保存到磁盘一次?您是否在基于Xen的VM上运行,例如AWS实例?您是否正在运行复制,如果是,有多少从机,它们是否处于良好状态,或者它们是否经常要求完全重新同步数据?你的命令中有没有"save"?

您可以使用命令行界面回答其中一些问题。例如,redis-cli info persistence将告诉您有关保存到磁盘的过程的信息,redis-cli info memory将告诉您有关内存消耗的信息。

在获取持久性信息时,您需要特别查看rdb_last_bgsave_statusrdb_last_bgsave_time_sec。这些将告诉您上次保存是否成功以及花费了多长时间。花费的时间越长,遇到资源问题的可能性就越高,遇到速度减慢的可能性就越高,这可能表现为无响应。

票数 0
EN

Stack Overflow用户

发布于 2017-02-08 11:02:58

尽管在最后一个块之前有一条return语句,但它始终会运行。您可以查看redis-py/connection.py,pool.release(连接)只将连接放到可用连接池中,因此连接仍然是活动的。关于redis服务器的cpu使用率,你的应用程序总是会发送请求,没有中断或休眠,所以它只会使用越来越多的cpu,而不是内存。cpu使用率与打开的文件数无关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13431803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档