0

0

Python 缓存失效策略设计

舞姬之光

舞姬之光

发布时间:2026-01-29 18:21:09

|

100人浏览过

|

来源于php中文网

原创

缓存失效的常见触发场景包括:用户修改商品价格、管理员更新配置、订单状态变更等业务动作;需精准删除关联多个key的数据,并绑定失效逻辑到数据变更点。

python 缓存失效策略设计

缓存失效的常见触发场景有哪些

缓存失效不是“要不要删”,而是“什么时候删、删哪些、删完怎么补”。真实系统里,cache.delete()cache.clear() 很少单独出现,它总和业务动作耦合:用户修改了商品价格、管理员更新了配置、订单状态从“待支付”变成“已支付”。

  • 用户提交表单后,需立即让对应商品详情页的缓存(key 含 product:123)失效,否则前端看到旧价格
  • 一个数据库行被更新,但缓存里可能有多个 key 关联它(如 user:456:profileuser:456:orders:recent),得批量清理
  • 某些缓存是组合生成的(比如首页推荐列表依赖用户标签 + 商品库存 + 活动开关),任一上游数据变动,都应触发该缓存失效

不区分场景统一用 timeout 被动过期,会导致脏数据窗口不可控;全靠手动 delete 又容易漏——关键在把失效逻辑“绑定”到数据变更点。

Django Cache 中如何安全地批量删除带通配符的 key

Django 默认缓存后端(如 LocMemCacheRedisCache)都不支持原生通配符删除。直接写 cache.delete("user:<em>")</em> 是无效的,它只会尝试删一个叫 user: 的字面 key。

  • Redis 后端可用 cache._cache.keys("user:*")(注意是私有属性,仅限 redis-py 后端),再循环 cache.delete(key);但高并发下 keys 命令阻塞 Redis,生产禁用
  • 更稳妥的做法是“主动记录 key 映射”:写缓存时,用一个集合 key(如 cache_keys:user:456)存下所有关联 key,失效时先取集合、再批量删、最后清空该集合
  • 如果用 django-redis,可启用 KEY_PREFIX 配合 cache.clear() 清局部命名空间,但要注意它会清整个前缀下的所有 key,包括临时缓存

别依赖 cache.keys() 做线上清理逻辑,它不是原子操作,且部分缓存后端根本不实现该方法。

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

AI工具箱
AI工具箱

AI工具箱是一个全方位AI资源聚合平台

下载

使用 time-based 失效时,为什么有时缓存没按预期刷新

timeout 参数看似简单,但实际受三个因素干扰:

  • 缓存后端时间不同步:Django 进程所在机器时间 vs Redis 服务器时间偏差 >1 秒,就可能导致 key “提前消失”或“滞留”
  • timeout=0 在某些后端(如 LocMemCache)表示“永不过期”,但在 PyLibMC 中可能被转成最大整数,行为不一致
  • 并发读写时,多个请求同时发现缓存 miss,都去重建,结果写入多份相同值——这不是失效问题,但会让“刚刷新就又脏了”的错觉更明显

建议:对时效敏感的数据(如库存、秒杀开关),不用纯 timeout,改用“主动失效 + 短 timeout 保底”双机制。例如设 timeout=30,同时在库存变更时显式 cache.delete("stock:789")

缓存穿透与失效雪崩的防御要点

缓存穿透(查不存在的 key,反复打穿缓存直击 DB)和失效雪崩(大量 key 同时过期,DB 瞬间被压垮)本质都是失效策略没兜住。

  • 对穿透:写缓存时,对查无结果的 key 也存一个空值(如 cache.set("user:999999", None, timeout=60)),并加前缀区分(如 empty:user:999999),避免和真实 None 混淆
  • 对雪崩:不要让大批 key 共享同一 timeout。可用随机偏移,例如 timeout=300 + random.randint(0, 60);或者按业务重要性分层设置过期时间(核心配置 5 分钟,用户偏好 30 分钟)
  • 更关键的是,失效后重建缓存的过程必须加锁。用 cache.add("lock:product:123", "1", timeout=5) 判断是否获得重建权,没抢到的请求等待或回退默认值,而不是各自查 DB

空值缓存和分布式锁不是可选项,是失效策略上线前必须验证的环节。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

169

2026.02.04

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

433

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

252

2023.10.07

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

289

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1010

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

675

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

501

2024.04.02

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号