7.2 KiB
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方法,只保留基本功能
- 保持了向后兼容性
使用示例
基本用法
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)
高级用法
# 批量更新
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())
异步用法
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)
主要优势
- 统一接口: 所有缓存后端都支持相同的dict操作接口
- 减少包装器: 无需TTLCache包装器,直接使用CacheBackend
- 更好的性能: 减少了一层包装,性能更好
- 更灵活: 支持region参数,可以更好地组织缓存
- 向后兼容: 原有的set/get/delete等方法仍然可用
- 完整功能: 支持所有标准的dict操作
迁移指南
从TTLCache迁移
# 旧代码
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迁移
# 旧代码
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相关的操作特性,实现了以下目标:
- ✅ 统一了缓存接口,所有后端都支持dict操作
- ✅ 简化了TTLCache类,去掉了dict-like方法,只保留基本功能
- ✅ 消除了对TTLCache包装器的依赖
- ✅ 保持了向后兼容性
- ✅ 提供了完整的dict操作功能
- ✅ 支持同步和异步操作
- ✅ 提供了详细的迁移指南和测试
主要改进
- 性能提升: 减少了包装器层,直接使用CacheBackend
- 接口统一: 所有缓存后端都支持相同的dict操作接口
- 功能完整: 支持所有标准的dict操作
- 代码简化: TTLCache不再重复实现dict操作
- 向后兼容: 原有的方法仍然可用
现在开发者可以直接使用CacheBackend的dict操作特性,享受更简洁、更统一、更高效的缓存操作体验!