RedisClusterException:使用连接池时Redis中的连接过多

时间:2018-08-27 07:44:25

标签: python asynchronous redis sanic

我正在使用aredis处理连接池。以下是我如何在主要功能中实例化Redis连接-

redis_conn = await asyncio.ensure_future(get_redis_conn(redis_host,       loop))

以下是例程的定义-

async def get_redis_conn(host, loop):
    return StrictRedisCluster(startup_nodes=host, decode_responses=True, loop=loop, max_connections=96)

我正在使用sanic运行Web服务器。这就是我实例化的方式-

app.run(host='0.0.0.0', port=port, after_start=after_start, workers=32)

我的实现在某种程度上是错误的吗?我不知道redis如何重用这些连接?

3 个答案:

答案 0 :(得分:0)

尽管在无法访问代码的情况下调试该问题有些困难,但似乎错误的是您正在使用的集群连接初始化。

我会猜测说您的“主要”方法使用的次数超过96次,这会导致您得到异常。

尝试为整个应用程序仅建立一次集群连接,然后将其与const isArraySorted = array => array .slice(0) // clone array .sort((a, b) => a - b) // sort it .every((el, i) => el === array[i]) // compare with initial value)一起传递:

app


本质上,这与我在此处建议的解决方案类似:How to use an aiohttp ClientSession with Sanic?

答案 1 :(得分:0)

由于redis-cluster允许为每个集群建立10000-32个开放连接。现在,如果您有10台服务器,则每台服务器最多只能建立1000个打开的连接。因此,对于您的情况,问题可能是,对于每台服务器,如果您有50个工作程序,则Redis初始化中的最大连接数应不超过20。请尝试减少每个工作程序的最大连接数,因为这对我来说是完美的

Eg:
StrictRedisCluster(startup_nodes=host, decode_responses=True, loop=loop, max_connections=35)

因此,您需要减少每个工作人员的max_connections限制。

答案 2 :(得分:0)

使用连接池,增加连接数 代码

import redis

redis_pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0)
conn = redis.Redis(connection_pool=redis_pool, max_connections=2 * 31)

http://www.chenxm.cc/article/1234.html