2

我正在使用 aredis 来处理连接池。以下是我如何在 main 函数中实例化 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如何重用这些连接?

4

3 回答 3

1

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

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

所以你需要减少每个工人的这个 max_connections 限制。

于 2019-06-13T12:48:09.103 回答
0

尽管在不访问您的代码的情况下调试问题有点困难,但对我来说似乎有问题的是您正在使用的集群连接初始化。

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

尝试为整个应用程序只建立一次集群连接,然后将其与您的app:

from sanic import Sanic 
from aredis import StrictRedisCluster    


app = Sanic(__name__)

@app.listener('before_server_start')
def init(app, loop):
    app.redis_conn = StrictRedisCluster(
        startup_nodes=HOST, decode_responses=True, loop=loop, max_connections=96
    )

@app.route("/")
async def test(request):
    return json.loads(await app.redis_conn.get(cache_key))


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


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

于 2018-12-18T12:58:30.727 回答
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

于 2021-04-30T11:17:02.647 回答