Python接口缓存需按场景选策略:本地缓存适用于高频读低更新场景,Redis适合多实例共享,HTTP缓存用于静态响应;须精准设计缓存键、防范穿透雪崩击穿,并加强可观测性与降级能力。
Python接口缓存不是“加个装饰器就完事”,关键在选对策略、控好粒度、避开陷阱。缓存用得好,QPS翻倍、数据库压力骤降;用得莽撞,数据不一致、内存爆满、雪崩连环发生。
不同接口对一致性、吞吐、延迟要求差异大,缓存不能一刀切:
functools.lru_cache 或 cacheout 做进程内缓存,毫秒级响应,零网络开销Cache-Control、ETag),让 CDN 或客户端直取,请求甚至不进 Python 进程缓存键(cache key)设计错误是脏数据的头号推手。常见问题:
Accept-Language、Authorization 中的 tenant_id)"id=123" 和 "id=0123" 应视为相同,但字符串直接拼接会缓存两份建议做法:对关键参数排序后拼接成规范字符串,例如:f"get_user:{sorted_dict_hash({'id': user_id, 'lang': lang})}"
真实线上环境,缓存不是稳态,而是动态战场:
300 + random.randint(0, 60))SETNX + 过期时间实现“逻辑锁”,只放行一个请求回源加载,其余等待或短暂重试上线后必须能看清缓存是否生效、命中率多少、哪些 key 占内存最多:
cache_hit_total{endpoint="user/profile"}
不复杂但容易忽略。