Spaces:
Running
Running
| # !/usr/bin/python3 | |
| # -*- coding: utf-8 -*- | |
| """ | |
| @Time : 2023/12/27 | |
| @Author : mashenquan | |
| @File : redis.py | |
| """ | |
| from __future__ import annotations | |
| import traceback | |
| from datetime import timedelta | |
| import redis.asyncio as aioredis | |
| from metagpt.configs.redis_config import RedisConfig | |
| from metagpt.logs import logger | |
| class Redis: | |
| def __init__(self, config: RedisConfig = None): | |
| self.config = config | |
| self._client = None | |
| async def _connect(self, force=False): | |
| if self._client and not force: | |
| return True | |
| try: | |
| self._client = await aioredis.from_url( | |
| self.config.to_url(), | |
| username=self.config.username, | |
| password=self.config.password, | |
| db=self.config.db, | |
| ) | |
| return True | |
| except Exception as e: | |
| logger.warning(f"Redis initialization has failed:{e}") | |
| return False | |
| async def get(self, key: str) -> bytes | None: | |
| if not await self._connect() or not key: | |
| return None | |
| try: | |
| v = await self._client.get(key) | |
| return v | |
| except Exception as e: | |
| logger.exception(f"{e}, stack:{traceback.format_exc()}") | |
| return None | |
| async def set(self, key: str, data: str, timeout_sec: int = None): | |
| if not await self._connect() or not key: | |
| return | |
| try: | |
| ex = None if not timeout_sec else timedelta(seconds=timeout_sec) | |
| await self._client.set(key, data, ex=ex) | |
| except Exception as e: | |
| logger.exception(f"{e}, stack:{traceback.format_exc()}") | |
| async def close(self): | |
| if not self._client: | |
| return | |
| await self._client.close() | |
| self._client = None | |