Python 实现简单缓存系统

6次阅读

用dict+时间戳实现带过期的内存缓存类,支持set(key,value,ttl)和get(key),读取时自动清理过期项;线程下加threading.lock保障安全;纯计算场景可直接用@lru_cache;需持久化可序列化到json文件。

Python 实现简单缓存系统

python 实现一个简单缓存系统,核心是控制数据的存储、读取和过期逻辑。不需要引入复杂框架,标准库就能搞定,适合轻量场景(比如配置缓存、API 响应暂存、计算结果复用)。

dict + 时间戳 实现带过期的内存缓存

最简方案:用字典存键值对,每个值附带一个过期时间戳。读取时检查是否过期,过期则删除并返回 None。

  • 写入时用 time.time() 计算绝对过期时间(如 expire_at = time.time() + 60 表示 60 秒后过期)
  • 读取前先判断 expire_at ,成立则 pop 掉该键,避免脏读
  • 封装成类,支持 set(key, value, ttl=60)get(key) 方法

利用 functools.lru_cache 快速缓存函数结果

如果目标只是避免重复执行耗时函数,Python 自带的 @lru_cache 是最省事的选择。

  • 加装饰器即可,例如 @lru_cache(maxsize=128)
  • 支持带参数的函数,自动按参数组合缓存结果
  • 注意:不支持过期,也不支持清除指定 key;适合纯计算、参数稳定、无需时效控制的场景
  • 需要手动清空可用 func.cache_clear()

加锁防止多线程下的并发写冲突

在多线程环境(如 flask/fastapi 启动多 worker)中,直接操作全局 dict 可能出错。简单加锁即可保障安全。

立即学习Python免费学习笔记(深入)”;

  • threading.Lock() 包裹 set/get 的关键段
  • 不必锁整个方法,只锁字典读写部分(如 self._cache[key] = ...key in self._cache
  • 若需进程间共享,就得换方案(如 redis、文件或 multiprocessing.Manager.dict)

扩展思路:序列化 + 持久化到文件(轻量持久缓存)

想重启后缓存不丢?可以定期把字典 dump 到 JSON 或 pickle 文件。

  • 初始化时尝试 load 已有文件,跳过过期项
  • 每次 set 后触发一次 save(或异步延迟保存,避免频繁 IO)
  • 注意 pickle 有安全风险,生产环境建议用 JSON(仅支持基础类型)或 msgpack
  • 不适合大数据量——文件读写会成为瓶颈

不复杂但容易忽略:缓存本质是用空间换时间,务必评估命中率和内存占用。小项目用 dict 足够,有并发或持久需求再逐步加锁或换存储。

text=ZqhQzanResources