cache_service.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. """
  2. 缓存服务
  3. 实现TTL缓存机制,提升数据访问性能。
  4. """
  5. import time
  6. from typing import Any, Optional
  7. from threading import Lock
  8. class CacheService:
  9. """缓存服务类"""
  10. def __init__(self):
  11. """初始化缓存服务"""
  12. self._cache = {}
  13. self._timestamps = {}
  14. self._lock = Lock()
  15. def get(self, key: str, ttl: int = 900) -> Optional[Any]:
  16. """
  17. 获取缓存数据
  18. Args:
  19. key: 缓存键
  20. ttl: 存活时间(秒),默认15分钟
  21. Returns:
  22. 缓存的值,如果不存在或已过期则返回None
  23. """
  24. with self._lock:
  25. if key in self._cache:
  26. # 检查是否过期
  27. if time.time() - self._timestamps[key] < ttl:
  28. return self._cache[key]
  29. else:
  30. # 已过期,删除缓存
  31. del self._cache[key]
  32. del self._timestamps[key]
  33. return None
  34. def set(self, key: str, value: Any) -> None:
  35. """
  36. 设置缓存数据
  37. Args:
  38. key: 缓存键
  39. value: 缓存值
  40. """
  41. with self._lock:
  42. self._cache[key] = value
  43. self._timestamps[key] = time.time()
  44. def delete(self, key: str) -> bool:
  45. """
  46. 删除缓存
  47. Args:
  48. key: 缓存键
  49. Returns:
  50. 是否成功删除
  51. """
  52. with self._lock:
  53. if key in self._cache:
  54. del self._cache[key]
  55. del self._timestamps[key]
  56. return True
  57. return False
  58. def clear(self) -> None:
  59. """清空所有缓存"""
  60. with self._lock:
  61. self._cache.clear()
  62. self._timestamps.clear()
  63. def cleanup_expired(self, ttl: int = 900) -> int:
  64. """
  65. 清理过期缓存
  66. Args:
  67. ttl: 存活时间(秒)
  68. Returns:
  69. 清理的条目数量
  70. """
  71. with self._lock:
  72. current_time = time.time()
  73. expired_keys = [
  74. key for key, timestamp in self._timestamps.items()
  75. if current_time - timestamp >= ttl
  76. ]
  77. for key in expired_keys:
  78. del self._cache[key]
  79. del self._timestamps[key]
  80. return len(expired_keys)
  81. def get_stats(self) -> dict:
  82. """
  83. 获取缓存统计信息
  84. Returns:
  85. 统计信息字典
  86. """
  87. with self._lock:
  88. return {
  89. "total_entries": len(self._cache),
  90. "oldest_entry_age": (
  91. time.time() - min(self._timestamps.values())
  92. if self._timestamps else 0
  93. ),
  94. "newest_entry_age": (
  95. time.time() - max(self._timestamps.values())
  96. if self._timestamps else 0
  97. )
  98. }
  99. # 全局缓存实例
  100. _global_cache = None
  101. def get_cache() -> CacheService:
  102. """
  103. 获取全局缓存实例
  104. Returns:
  105. 全局缓存服务实例
  106. """
  107. global _global_cache
  108. if _global_cache is None:
  109. _global_cache = CacheService()
  110. return _global_cache