shelve 的使用

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}")
posted @ 2025-06-19 11:42  sec001  阅读(27)  评论(0)    收藏  举报