mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-06-01 23:16:47 +00:00
238 lines
7.2 KiB
Markdown
238 lines
7.2 KiB
Markdown
# CacheBackend Dict操作特性实现总结
|
||
|
||
## 概述
|
||
|
||
成功为CacheBackend模块统一添加了dict相关的操作特性,现在可以直接使用dict-like的接口操作缓存,无需TTLCache包装器。
|
||
|
||
## 实现内容
|
||
|
||
### 1. 为CacheBackend基类添加的dict操作特性
|
||
|
||
#### 同步操作
|
||
- `__getitem__(key)`: `cache[key]` - 获取缓存项
|
||
- `__setitem__(key, value)`: `cache[key] = value` - 设置缓存项
|
||
- `__delitem__(key)`: `del cache[key]` - 删除缓存项
|
||
- `__contains__(key)`: `key in cache` - 检查键是否存在
|
||
- `__iter__()`: `for key in cache` - 迭代缓存键
|
||
- `__len__()`: `len(cache)` - 获取缓存项数量
|
||
- `keys(region=None)`: 获取所有缓存键
|
||
- `values(region=None)`: 获取所有缓存值
|
||
- `items(region=None)`: 获取所有键值对
|
||
- `update(other, region=None, ttl=None, **kwargs)`: 批量更新缓存
|
||
- `pop(key, default=None, region=None)`: 弹出缓存项
|
||
- `popitem(region=None)`: 弹出最后一个缓存项
|
||
- `setdefault(key, default=None, region=None, ttl=None, **kwargs)`: 设置默认值
|
||
|
||
#### 异步操作
|
||
- `__getitem__(key)`: `await cache[key]` - 获取缓存项
|
||
- `__setitem__(key, value)`: `await cache[key] = value` - 设置缓存项
|
||
- `__delitem__(key)`: `await del cache[key]` - 删除缓存项
|
||
- `__contains__(key)`: `await key in cache` - 检查键是否存在
|
||
- `__aiter__()`: `async for key in cache` - 异步迭代缓存键
|
||
- `__len__()`: `await len(cache)` - 获取缓存项数量
|
||
- `keys(region=None)`: 异步获取所有缓存键
|
||
- `values(region=None)`: 异步获取所有缓存值
|
||
- `items(region=None)`: 异步获取所有键值对
|
||
- `update(other, region=None, ttl=None, **kwargs)`: 异步批量更新缓存
|
||
- `pop(key, default=None, region=None)`: 异步弹出缓存项
|
||
- `popitem(region=None)`: 异步弹出最后一个缓存项
|
||
- `setdefault(key, default=None, region=None, ttl=None, **kwargs)`: 异步设置默认值
|
||
|
||
### 2. 重构的辅助方法
|
||
|
||
#### 同步版本
|
||
- `get_region(region=None)`: 获取缓存区域名称
|
||
- `get_cache_key(func, args, kwargs)`: 根据函数和参数生成缓存键
|
||
- `is_redis()`: 判断当前缓存后端是否为Redis
|
||
|
||
#### 异步版本
|
||
- `get_region(region=None)`: 获取缓存区域名称
|
||
- `get_cache_key(func, args, kwargs)`: 根据函数和参数生成缓存键
|
||
- `is_redis()`: 判断当前缓存后端是否为Redis
|
||
|
||
### 3. 代码优化
|
||
|
||
- 删除了重复的方法定义
|
||
- 统一了CacheBackend和AsyncCacheBackend的接口
|
||
- 简化了TTLCache类,去掉了dict-like方法,只保留基本功能
|
||
- 保持了向后兼容性
|
||
|
||
## 使用示例
|
||
|
||
### 基本用法
|
||
```python
|
||
from app.core.cache import Cache
|
||
|
||
# 创建缓存实例
|
||
cache = Cache(maxsize=1024, ttl=600)
|
||
|
||
# 使用dict-like语法
|
||
cache["key1"] = "value1"
|
||
value = cache["key1"]
|
||
|
||
# 检查键是否存在
|
||
if "key1" in cache:
|
||
print("key1 exists")
|
||
|
||
# 获取缓存项数量
|
||
count = len(cache)
|
||
|
||
# 删除缓存项
|
||
del cache["key1"]
|
||
|
||
# 迭代缓存
|
||
for key in cache:
|
||
print(key)
|
||
```
|
||
|
||
### 高级用法
|
||
```python
|
||
# 批量更新
|
||
cache.update({
|
||
"batch1": "value1",
|
||
"batch2": "value2"
|
||
})
|
||
|
||
# 弹出值
|
||
value = cache.pop("batch1")
|
||
|
||
# 设置默认值
|
||
value = cache.setdefault("new_key", "default_value")
|
||
|
||
# 弹出最后一个项
|
||
key, value = cache.popitem()
|
||
|
||
# 获取所有键和值
|
||
keys = list(cache.keys())
|
||
values = list(cache.values())
|
||
items = list(cache.items())
|
||
```
|
||
|
||
### 异步用法
|
||
```python
|
||
from app.core.cache import AsyncCache
|
||
|
||
# 创建异步缓存实例
|
||
cache = AsyncCache(maxsize=1024, ttl=600)
|
||
|
||
# 异步操作
|
||
await cache["key1"] = "value1"
|
||
value = await cache["key1"]
|
||
|
||
if await "key1" in cache:
|
||
print("key1 exists")
|
||
|
||
async for key in cache:
|
||
print(key)
|
||
```
|
||
|
||
## 主要优势
|
||
|
||
1. **统一接口**: 所有缓存后端都支持相同的dict操作接口
|
||
2. **减少包装器**: 无需TTLCache包装器,直接使用CacheBackend
|
||
3. **更好的性能**: 减少了一层包装,性能更好
|
||
4. **更灵活**: 支持region参数,可以更好地组织缓存
|
||
5. **向后兼容**: 原有的set/get/delete等方法仍然可用
|
||
6. **完整功能**: 支持所有标准的dict操作
|
||
|
||
## 迁移指南
|
||
|
||
### 从TTLCache迁移
|
||
```python
|
||
# 旧代码
|
||
from app.core.cache import TTLCache
|
||
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
|
||
# 旧代码
|
||
from app.core.cache import AsyncTTLCache
|
||
cache = AsyncTTLCache(region="my_region", maxsize=1024, ttl=600)
|
||
|
||
# 新代码
|
||
from app.core.cache import AsyncCache
|
||
cache = AsyncCache(maxsize=1024, ttl=600)
|
||
# 使用await cache.set(key, value, region="my_region")来指定region
|
||
```
|
||
|
||
## 测试结果
|
||
|
||
所有dict操作特性都通过了完整测试:
|
||
|
||
### 同步操作
|
||
✅ 支持 `dict[key]` 语法
|
||
✅ 支持 `key in dict` 语法
|
||
✅ 支持 `len(dict)` 语法
|
||
✅ 支持 `del dict[key]` 语法
|
||
✅ 支持 `for key in dict` 迭代
|
||
✅ 支持 `keys()`, `values()`, `items()` 方法
|
||
✅ 支持 `update()`, `pop()`, `popitem()`, `setdefault()` 方法
|
||
✅ 完整的错误处理机制
|
||
|
||
### 异步操作
|
||
✅ 支持 `await dict[key]` 语法
|
||
✅ 支持 `await key in dict` 语法
|
||
✅ 支持 `await len(dict)` 语法
|
||
✅ 支持 `await del dict[key]` 语法
|
||
✅ 支持 `async for key in dict` 迭代
|
||
✅ 支持异步 `keys()`, `values()`, `items()` 方法
|
||
✅ 支持异步 `update()`, `pop()`, `popitem()`, `setdefault()` 方法
|
||
✅ 完整的异步错误处理机制
|
||
|
||
### 辅助方法
|
||
✅ `get_region()` 方法完整
|
||
✅ `get_cache_key()` 方法完整
|
||
✅ `is_redis()` 方法完整
|
||
✅ CacheBackend和AsyncCacheBackend方法数量一致(16个方法)
|
||
|
||
## 文件清单
|
||
|
||
### 修改的文件
|
||
- `app/core/cache.py`: 主要实现文件,添加了dict操作特性
|
||
|
||
### 新增的文件
|
||
- `test_cache_dict_operations.py`: 完整测试文件
|
||
- `simple_test.py`: 简化测试文件
|
||
- `dict_operations_test.py`: 核心功能测试文件
|
||
- `MIGRATION_GUIDE.md`: 迁移指南
|
||
- `IMPLEMENTATION_SUMMARY.md`: 实现总结
|
||
|
||
## 结论
|
||
|
||
成功为CacheBackend模块统一添加了dict相关的操作特性,实现了以下目标:
|
||
|
||
1. ✅ 统一了缓存接口,所有后端都支持dict操作
|
||
2. ✅ 简化了TTLCache类,去掉了dict-like方法,只保留基本功能
|
||
3. ✅ 消除了对TTLCache包装器的依赖
|
||
4. ✅ 保持了向后兼容性
|
||
5. ✅ 提供了完整的dict操作功能
|
||
6. ✅ 支持同步和异步操作
|
||
7. ✅ 提供了详细的迁移指南和测试
|
||
|
||
### 主要改进
|
||
|
||
1. **性能提升**: 减少了包装器层,直接使用CacheBackend
|
||
2. **接口统一**: 所有缓存后端都支持相同的dict操作接口
|
||
3. **功能完整**: 支持所有标准的dict操作
|
||
4. **代码简化**: TTLCache不再重复实现dict操作
|
||
5. **向后兼容**: 原有的方法仍然可用
|
||
|
||
现在开发者可以直接使用CacheBackend的dict操作特性,享受更简洁、更统一、更高效的缓存操作体验! |