import shelve
import time
from typing import Any
def cache_data(key: str, data: Any, shelf_file: str = 'cache.db') -> None:
"""将数据缓存到本地 shelve 文件"""
with shelve.open(shelf_file) as shelf:
shelf[key] = {
'data': data,
'timestamp': time.time()
}
def get_cached_data(key: str, max_age: int = 3600, shelf_file: str = 'cache.db') -> Any:
"""
从缓存中获取数据
max_age: 缓存有效期(秒), 默认1小时
返回: 缓存数据或 None(如果缓存不存在或过期)
"""
try:
with shelve.open(shelf_file) as shelf:
if key in shelf:
cached = shelf[key]
if time.time() - cached['timestamp'] <= max_age:
return cached['data']
else:
del shelf[key] # 删除过期缓存
except Exception as e:
print(f"缓存读取错误: {e}")
return None
# 示例用法
if __name__ == "__main__":
# 模拟获取数据的函数
def get_expensive_data():
print("执行昂贵的数据获取操作...")
return {"result": "一些复杂计算的结果", "value": 42}
cache_key = "expensive_data"
# 尝试从缓存中获取数据
cached_result = get_cached_data(cache_key)
if cached_result is None:
# 缓存不存在或过期, 获取新数据并缓存
result = get_expensive_data()
cache_data(cache_key, result)
print(f"已缓存新数据: {result}")
else:
# 使用缓存数据
print(f"使用缓存数据: {cached_result}")