redis_cache.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """
  2. Redis缓存服务
  3. """
  4. import json
  5. import redis
  6. from typing import Any, Optional, Union
  7. from app.config import settings
  8. class RedisCache:
  9. """Redis缓存管理器"""
  10. def __init__(self):
  11. self.client = redis.from_url(settings.REDIS_URL, decode_responses=True)
  12. async def get(self, key: str) -> Optional[Any]:
  13. """获取缓存值"""
  14. try:
  15. value = self.client.get(key)
  16. if value:
  17. return json.loads(value)
  18. return None
  19. except Exception as e:
  20. from app.core.logger import logger
  21. logger.exception("Redis get error")
  22. return None
  23. async def set(self, key: str, value: Any, expire: int = 3600) -> bool:
  24. """设置缓存值"""
  25. try:
  26. json_value = json.dumps(value)
  27. return self.client.setex(key, expire, json_value)
  28. except Exception as e:
  29. from app.core.logger import logger
  30. logger.exception("Redis set error")
  31. return False
  32. async def delete(self, key: str) -> bool:
  33. """删除缓存值"""
  34. try:
  35. return bool(self.client.delete(key))
  36. except Exception as e:
  37. from app.core.logger import logger
  38. logger.exception("Redis delete error")
  39. return False
  40. async def exists(self, key: str) -> bool:
  41. """检查键是否存在"""
  42. try:
  43. return bool(self.client.exists(key))
  44. except Exception as e:
  45. from app.core.logger import logger
  46. logger.exception("Redis exists error")
  47. return False
  48. async def expire(self, key: str, time: int) -> bool:
  49. """设置过期时间"""
  50. try:
  51. return bool(self.client.expire(key, time))
  52. except Exception as e:
  53. from app.core.logger import logger
  54. logger.exception("Redis expire error")
  55. return False
  56. def close(self):
  57. """关闭连接"""
  58. try:
  59. self.client.close()
  60. except Exception as e:
  61. from app.core.logger import logger
  62. logger.exception("Redis close error")
  63. # 全局缓存实例
  64. redis_cache = RedisCache()
  65. async def get_cache() -> RedisCache:
  66. """获取缓存实例的依赖注入函数"""
  67. return redis_cache