db_redis.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import sys
  4. from redis.asyncio.client import Redis
  5. from redis.exceptions import AuthenticationError, TimeoutError
  6. from common.log import log
  7. from core.conf import settings
  8. class RedisCli(Redis):
  9. def __init__(self):
  10. super(RedisCli, self).__init__(
  11. host=settings.REDIS_HOST,
  12. port=settings.REDIS_PORT,
  13. password=settings.REDIS_PASSWORD,
  14. db=settings.REDIS_DATABASE,
  15. socket_timeout=settings.REDIS_TIMEOUT,
  16. decode_responses=True, # 转码 utf-8
  17. )
  18. async def open(self):
  19. """
  20. 触发初始化连接
  21. :return:
  22. """
  23. try:
  24. await self.ping()
  25. except TimeoutError:
  26. log.error('❌ 数据库 redis 连接超时')
  27. sys.exit()
  28. except AuthenticationError:
  29. log.error('❌ 数据库 redis 连接认证失败')
  30. sys.exit()
  31. except Exception as e:
  32. log.error('❌ 数据库 redis 连接异常 {}', e)
  33. sys.exit()
  34. async def delete_prefix(self, prefix: str, exclude: str | list = None):
  35. """
  36. 删除指定前缀的所有key
  37. :param prefix:
  38. :param exclude:
  39. :return:
  40. """
  41. keys = []
  42. async for key in self.scan_iter(match=f'{prefix}*'):
  43. if isinstance(exclude, str):
  44. if key != exclude:
  45. keys.append(key)
  46. elif isinstance(exclude, list):
  47. if key not in exclude:
  48. keys.append(key)
  49. else:
  50. keys.append(key)
  51. if keys:
  52. await self.delete(*keys)
  53. # 创建 redis 客户端实例
  54. redis_client = RedisCli()