使用单个redis连接(aioredis)

2024-06-16 03:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序将每秒通过redis发送数百条(如果不是数千条)消息,因此我们将在应用程序启动时打开连接,并在每次交易中使用该连接。我很难保持连接畅通

以下是我的一些redis处理程序类:

class RedisSingleDatabase(AsyncGetSetDatabase):

    async def redis(self):
        if not self._redis:
            self._redis = await aioredis.create_redis(('redis', REDIS_PORT))
        return self._redis

    def __init__(self):
        self._redis = None

    async def get(self, key):
        r = await self.redis()
        # r = await aioredis.create_redis(('redis', REDIS_PORT))
        print(f'CONNECTION IS {"CLOSED" if r.closed else "OPEN"}!')
        data = await r.get(key, encoding='utf-8')
        if data is not None:
            return json.loads(data)

这是行不通的。当我们调用r.get时,连接已关闭(ConnectionClosedError

如果我取消对get方法的第二行的注释,并在该方法中本地连接到数据库,它就会工作。但是我们不再使用相同的连接

我也考虑过使用依赖注入来尝试这一切。这是一个flask应用程序,在我的create_app方法中,我将连接到数据库并使用该连接构造我的RedisSingleDatabase。除了我当前的问题是否相同之外,我似乎无法让这种方法起作用,因为我们需要await连接,我无法在我的根级别create_app进行连接,这不能是异步的!(除非我遗漏了什么)

我已经到处尝试了asyncio.run,它要么没有解决问题,要么引发了自己的错误,无法从正在运行的事件循环调用它

请帮忙


Tags: 方法selfredis应用程序datagetasyncif