redis_cache.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import json
  2. from typing import Optional, Dict, Any
  3. from utils import logger, RedisUtil
  4. from .base_cache import BaseCache
  5. class RedisCache(BaseCache):
  6. """基于Redis的缓存实现"""
  7. def __init__(self):
  8. self.redis = None
  9. async def initialize(self):
  10. """异步初始化方法,需在实例化后调用"""
  11. try:
  12. self.redis = await RedisUtil.get_redis_pool()
  13. except Exception as e:
  14. logger.error(f"Redis缓存初始化失败:{e}")
  15. raise
  16. async def get(self, cache_name: str, key: str) -> Optional[str]:
  17. """获取缓存值
  18. Args:
  19. cache_name: 缓存命名空间
  20. key: 缓存键
  21. Returns:
  22. 缓存值(若存在)
  23. """
  24. return await self.redis.get(f"{cache_name}:{key}")
  25. async def set(self, cache_name: str, key: str, value: str) -> None:
  26. """设置缓存值
  27. Args:
  28. cache_name: 缓存命名空间
  29. key: 缓存键
  30. value: 缓存值
  31. """
  32. await self.redis.set(f"{cache_name}:{key}", value)
  33. async def get_dict(self, cache_name: str, key: str) -> Optional[Dict[str, Any]]:
  34. """获取字典类型缓存值
  35. Returns:
  36. Optional[Dict[str, Any]]: 返回指定的字典缓存,若不存在或解析失败则返回None
  37. """
  38. try:
  39. data = await self.redis.get(f"{cache_name}:{key}")
  40. if data:
  41. return json.loads(data)
  42. return None
  43. except json.JSONDecodeError:
  44. logger.error(f"缓存解析失败:{cache_name}:{key}")
  45. return None
  46. async def set_dict(self, cache_name: str, key: str, value: Dict[str, Any]) -> None:
  47. """设置字典类型缓存值
  48. Args:
  49. cache_name: 缓存命名空间
  50. key: 缓存键
  51. value: 字典类型缓存值
  52. """
  53. await self.redis.set(
  54. f"{cache_name}:{key}", json.dumps(value, ensure_ascii=False)
  55. )
  56. async def delete(self, cache_name: str, key: str) -> None:
  57. """删除缓存
  58. Args:
  59. cache_name: 缓存命名空间
  60. key: 缓存键
  61. """
  62. await self.redis.delete(f"{cache_name}:{key}")
  63. async def clear(self, cache_name: str, key: str = None) -> None:
  64. """清空指定缓存
  65. Args:
  66. cache_name: 缓存命名空间
  67. key:
  68. """
  69. if key:
  70. await self.redis.delete(f"{cache_name}:{key}")
  71. else:
  72. await self.redis.delete(f"{cache_name}:*")