python Redis连接

时间:2012-11-17 15:04:16

标签: python redis

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

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

我注意到Redis cpu的使用率有时是100%而Redis服务器没有响应/慢。

我想使用每个应用程序1个连接池共4个连接。 因此,例如,如果我在最多20台机器上运行我的应用程序,应该有 20 * 4 =与redis服务器的80个连接。

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()

上面的代码应该运行20个线程,这些线程在执行命令时从max size 4的连接池获得连接。

何时释放连接?

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

    #### 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语句。那么最后的目的是什么?

2 个答案:

答案 0 :(得分:0)

正如Matthew Scragg所说,finally子句在测试结束时执行。在这种特殊情况下,它可以在完成后将连接释放回池中,而不是将其悬挂打开。

关于无反应,请查看服务器正在执行的操作。 Redis实例的内存限制是多少?你多久保存一次磁盘?您是在基于Xen的VM上运行,例如AWS实例吗?您是否正在运行复制,如果是这样,有多少从站,它们处于良好状态还是经常要求完全重新同步数据?你的任何命令都是"保存"?

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

获取持久性信息时,您需要专门查看rdb_last_bgsave_statusrdb_last_bgsave_time_sec。这些将告诉您上次保存是否成功以及花了多长时间。花费的时间越长,您遇到资源问题的可能性就越大,您遇到的速度就越慢,这可能会导致无响应。

答案 1 :(得分:0)

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

相关问题