HealthCacheService.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # cache_service.py
  2. import json
  3. import hashlib
  4. import logging
  5. import redis
  6. from typing import Optional, Dict, Any
  7. class CacheService:
  8. def __init__(self, host: str = '192.168.50.233', port: int = 6379,
  9. db: int = 10, password: int = 123456, ttl: Optional[int] = None):
  10. """
  11. 初始化Redis缓存服务
  12. :param ttl: 默认缓存时间(秒)
  13. """
  14. self.client = redis.Redis(
  15. host=host,
  16. port=port,
  17. db=db,
  18. password=password,
  19. decode_responses=True,
  20. socket_connect_timeout=5,
  21. socket_timeout=5
  22. )
  23. self.ttl = ttl
  24. self.logger = logging.getLogger(__name__)
  25. def _generate_cache_key(self, request_body: Dict[str, Any]) -> str:
  26. """
  27. 根据请求体生成唯一的缓存键
  28. """
  29. request_str = json.dumps(request_body, sort_keys=True)
  30. return f"health:cache:{hashlib.sha256(request_str.encode()).hexdigest()}"
  31. def get_cached_response(self, request_body: Dict[str, Any]) -> Optional[Dict[str, Any]]:
  32. """
  33. 获取缓存结果
  34. :return: 如果存在则返回缓存结果,否则返回None
  35. """
  36. cache_key = self._generate_cache_key(request_body)
  37. try:
  38. cached = self.client.get(cache_key)
  39. if cached:
  40. self.logger.info(f"缓存命中: {cache_key}")
  41. return json.loads(cached)
  42. return None
  43. except Exception as e:
  44. self.logger.error(f"获取缓存失败: {str(e)}")
  45. return None
  46. def set_cached_response(self, request_body: Dict[str, Any],
  47. response_data: Dict[str, Any],
  48. ttl: Optional[int] = None) -> bool:
  49. """
  50. 设置缓存结果
  51. :param ttl: 如果为 None 或 0,则永久缓存
  52. """
  53. cache_key = self._generate_cache_key(request_body)
  54. try:
  55. expire_time = ttl if ttl is not None else self.ttl
  56. if expire_time is None or expire_time <= 0:
  57. # 永久缓存
  58. self.client.set(cache_key, json.dumps(response_data))
  59. self.logger.info(f"缓存已设置(永久): {cache_key}")
  60. else:
  61. # 带过期时间的缓存
  62. self.client.setex(cache_key, expire_time, json.dumps(response_data))
  63. self.logger.info(f"缓存已设置(TTL: {expire_time}s): {cache_key}")
  64. return True
  65. except Exception as e:
  66. self.logger.error(f"设置缓存失败: {str(e)}")
  67. return False
  68. def clear_cache(self, request_body: Dict[str, Any]) -> bool:
  69. """清除指定请求的缓存"""
  70. cache_key = self._generate_cache_key(request_body)
  71. try:
  72. self.client.delete(cache_key)
  73. self.logger.info(f"缓存已清除: {cache_key}")
  74. return True
  75. except Exception as e:
  76. self.logger.error(f"清除缓存失败: {str(e)}")
  77. return False
  78. def ping(self) -> bool:
  79. """检查Redis连接是否正常"""
  80. try:
  81. return self.client.ping()
  82. except Exception as e:
  83. self.logger.error(f"Redis连接测试失败: {str(e)}")
  84. return False