mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-02-13 07:25:53 +08:00
Simplify TTLCache, remove dict-like methods, enhance Cache interface
Co-authored-by: jxxghp <jxxghp@live.cn>
This commit is contained in:
@@ -54,6 +54,7 @@
|
||||
|
||||
- 删除了重复的方法定义
|
||||
- 统一了CacheBackend和AsyncCacheBackend的接口
|
||||
- 简化了TTLCache类,去掉了dict-like方法,只保留基本功能
|
||||
- 保持了向后兼容性
|
||||
|
||||
## 使用示例
|
||||
@@ -146,8 +147,20 @@ cache = TTLCache(region="my_region", maxsize=1024, ttl=600)
|
||||
from app.core.cache import Cache
|
||||
cache = Cache(maxsize=1024, ttl=600)
|
||||
# 使用cache.set(key, value, region="my_region")来指定region
|
||||
# 或者直接使用dict语法: cache[key] = value
|
||||
```
|
||||
|
||||
### TTLCache简化说明
|
||||
TTLCache类已经被简化,去掉了dict-like方法(如`__getitem__`、`__setitem__`等),现在只保留基本的方法:
|
||||
- `set(key, value, ttl=None)`
|
||||
- `get(key, default=None)`
|
||||
- `delete(key)`
|
||||
- `clear()`
|
||||
- `is_redis()`
|
||||
- `close()`
|
||||
|
||||
建议直接使用Cache类,它提供了完整的dict操作特性。
|
||||
|
||||
### 从AsyncTTLCache迁移
|
||||
```python
|
||||
# 旧代码
|
||||
@@ -207,10 +220,19 @@ cache = AsyncCache(maxsize=1024, ttl=600)
|
||||
成功为CacheBackend模块统一添加了dict相关的操作特性,实现了以下目标:
|
||||
|
||||
1. ✅ 统一了缓存接口,所有后端都支持dict操作
|
||||
2. ✅ 消除了对TTLCache包装器的依赖
|
||||
3. ✅ 保持了向后兼容性
|
||||
4. ✅ 提供了完整的dict操作功能
|
||||
5. ✅ 支持同步和异步操作
|
||||
6. ✅ 提供了详细的迁移指南和测试
|
||||
2. ✅ 简化了TTLCache类,去掉了dict-like方法,只保留基本功能
|
||||
3. ✅ 消除了对TTLCache包装器的依赖
|
||||
4. ✅ 保持了向后兼容性
|
||||
5. ✅ 提供了完整的dict操作功能
|
||||
6. ✅ 支持同步和异步操作
|
||||
7. ✅ 提供了详细的迁移指南和测试
|
||||
|
||||
现在开发者可以直接使用CacheBackend的dict操作特性,享受更简洁、更统一的缓存操作体验。
|
||||
### 主要改进
|
||||
|
||||
1. **性能提升**: 减少了包装器层,直接使用CacheBackend
|
||||
2. **接口统一**: 所有缓存后端都支持相同的dict操作接口
|
||||
3. **功能完整**: 支持所有标准的dict操作
|
||||
4. **代码简化**: TTLCache不再重复实现dict操作
|
||||
5. **向后兼容**: 原有的方法仍然可用
|
||||
|
||||
现在开发者可以直接使用CacheBackend的dict操作特性,享受更简洁、更统一、更高效的缓存操作体验!
|
||||
@@ -48,28 +48,15 @@ from app.core.cache import TTLCache
|
||||
cache = TTLCache(region="my_region", maxsize=1024, ttl=600)
|
||||
|
||||
# 设置缓存
|
||||
cache["key1"] = "value1"
|
||||
cache.set("key1", "value1")
|
||||
cache.set("key2", "value2")
|
||||
|
||||
# 获取缓存
|
||||
value1 = cache["key1"]
|
||||
value1 = cache.get("key1")
|
||||
value2 = cache.get("key2", "default")
|
||||
|
||||
# 检查键是否存在
|
||||
if "key1" in cache:
|
||||
print("key1 exists")
|
||||
|
||||
# 删除缓存
|
||||
del cache["key1"]
|
||||
cache.delete("key2")
|
||||
|
||||
# 迭代缓存
|
||||
for key in cache:
|
||||
print(key)
|
||||
|
||||
# 获取所有键值对
|
||||
for key, value in cache.items():
|
||||
print(f"{key}: {value}")
|
||||
cache.delete("key1")
|
||||
|
||||
# 清空缓存
|
||||
cache.clear()
|
||||
|
||||
@@ -1011,12 +1011,9 @@ def Cache(maxsize: Optional[int] = None, ttl: Optional[int] = None) -> CacheBack
|
||||
|
||||
class TTLCache:
|
||||
"""
|
||||
TTL缓存类,根据配置自动选择使用Redis或cachetools,maxsize仅在未启用Redis时生效
|
||||
|
||||
特性:
|
||||
- 提供与cachetools.TTLCache相同的接口
|
||||
- 根据配置自动选择缓存后端
|
||||
- 支持Redis和cachetools的切换
|
||||
TTL缓存类,现在只是一个简单的包装器,建议直接使用Cache类
|
||||
|
||||
注意:此类已过时,建议直接使用Cache类,它提供了完整的dict操作特性
|
||||
"""
|
||||
|
||||
def __init__(self, region: Optional[str] = DEFAULT_CACHE_REGION,
|
||||
@@ -1033,54 +1030,6 @@ class TTLCache:
|
||||
self.ttl = ttl
|
||||
self._backend = Cache(maxsize=maxsize, ttl=ttl)
|
||||
|
||||
def __getitem__(self, key: str):
|
||||
"""
|
||||
获取缓存项
|
||||
"""
|
||||
try:
|
||||
value = self._backend.get(key, region=self.region)
|
||||
if value is not None:
|
||||
return value
|
||||
except Exception as e:
|
||||
logger.warning(f"缓存获取失败: {e}")
|
||||
|
||||
raise KeyError(key)
|
||||
|
||||
def __setitem__(self, key: str, value: Any):
|
||||
"""
|
||||
设置缓存项
|
||||
"""
|
||||
try:
|
||||
self._backend.set(key, value, ttl=self.ttl, region=self.region)
|
||||
except Exception as e:
|
||||
logger.warning(f"缓存设置失败: {e}")
|
||||
|
||||
def __delitem__(self, key: str):
|
||||
"""
|
||||
删除缓存项
|
||||
"""
|
||||
try:
|
||||
self._backend.delete(key, region=self.region)
|
||||
except Exception as e:
|
||||
logger.warning(f"缓存删除失败: {e}")
|
||||
|
||||
def __contains__(self, key: str):
|
||||
"""
|
||||
检查键是否存在
|
||||
"""
|
||||
try:
|
||||
return self._backend.exists(key, region=self.region)
|
||||
except Exception as e:
|
||||
logger.warning(f"缓存检查失败: {e}")
|
||||
return False
|
||||
|
||||
def __iter__(self):
|
||||
"""
|
||||
返回缓存的迭代器
|
||||
"""
|
||||
for key, _ in self._backend.items(region=self.region):
|
||||
yield key
|
||||
|
||||
def set(self, key: str, value: Any, ttl: Optional[int] = None):
|
||||
"""
|
||||
设置缓存项,支持自定义 TTL
|
||||
@@ -1113,16 +1062,6 @@ class TTLCache:
|
||||
except Exception as e:
|
||||
logger.warning(f"缓存删除失败: {e}")
|
||||
|
||||
def items(self):
|
||||
"""
|
||||
获取缓存的所有键值对
|
||||
"""
|
||||
try:
|
||||
return self._backend.items(region=self.region)
|
||||
except Exception as e:
|
||||
logger.warning(f"缓存获取失败: {e}")
|
||||
return []
|
||||
|
||||
def clear(self):
|
||||
"""
|
||||
清空缓存
|
||||
|
||||
Reference in New Issue
Block a user