python缓存设计核心是选对策略、控好粒度、管住生命周期;需依场景选用@lru_cache、redis-py、diskcache等工具,规范键设计,合理设置失效策略,并实施击穿、雪崩、穿透防护。

Python缓存设计的核心目标是减少重复计算和I/O开销,提升响应速度与系统吞吐。关键不在于“加缓存”,而在于选对策略、控好粒度、管住生命周期。
用对工具:内置缓存 vs 第三方库
Python标准库提供 @lru_cache,适合纯函数、参数可哈希、内存可控的场景。例如计算斐波那契数列或解析固定配置:
@lru_cache(maxsize=128)
def parse_config(path):
with open(path) as f:
return json.load(f)
但注意:它不支持过期时间、分布式共享、异步调用。高并发或需跨进程/服务共享时,应切换到 redis-py 或 aioredis;若需本地高性能多线程缓存,diskcache(支持持久化+过期+大小限制)比单纯用字典更可靠。
缓存键设计:唯一、稳定、轻量
键是缓存命中的前提。避免用原始对象、含时间戳的字典、未标准化的URL等易变值。推荐做法:
DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。
立即学习“Python免费学习笔记(深入)”;
- 对参数做确定性序列化:用 hashlib.md5(str(sorted(kwargs.items())).encode()).hexdigest()(注意排除非关键参数如 trace_id)
- 数据库查询结果缓存,键建议为 "user:profile:{user_id}:v2",显式带版本号,便于灰度更新逻辑后批量失效
- 避免在键中拼接敏感信息(如手机号、token),防止缓存泄露或命中冲突
失效策略:按需选择,拒绝“全删”惯性
缓存不一致常源于失效滞后。不要一更新就 flush_all():
- 写后失效(Cache-Aside):更新DB成功后,del cache[key],下次读自动重建——简单可靠,适合读多写少
- 写时更新(Write-Through):更新DB同时同步写缓存,适合缓存命中率极高且数据结构稳定
- 设置合理 TTL:如用户会话缓存 30 分钟,商品库存缓存 5 秒,用 redis 的 EXPIRE 或 diskcache 的 expire 参数控制
- 主动刷新(Refresh-Ahead):对热点但缓慢变化的数据(如首页推荐),后台定时预热,避免雪崩
防击穿、防雪崩、防穿透:生产必须项
缓存异常会直接压垮下游。三类问题对应基础防护:
- 击穿:单个热点 key 过期瞬间大量请求直达 DB → 用 互斥锁(如 redis.set(key, val, nx=True, ex=30))确保只有一个请求重建缓存
- 雪崩:大量 key 同一时刻过期 → 设置随机 TTL 偏差(如 base=60s + random(0, 60))
- 穿透:查不存在的 ID(如 -1、超长字符串)反复打DB → 对空结果也缓存(cache.set("user:-1", None, ex=60)),或用布隆过滤器前置拦截
缓存不是银弹,而是权衡的艺术:多占一点内存,换响应快一点;多加一层校验,换数据稳一点。从接口维度评估缓存收益(QPS 提升?P99 下降?DB CPU 降低?),再迭代优化,效果远胜盲目堆砌。









