0

0

Python 缓存更新策略的设计原则

舞夢輝影

舞夢輝影

发布时间:2026-02-18 14:50:03

|

337人浏览过

|

来源于php中文网

原创

缓存失效时优先用 delete 后异步 set,而非 set 空值或直接覆盖;因 delete 可避免脏读、降低并发回源风险,且空缓存可接受时更安全。

python 缓存更新策略的设计原则

缓存失效时该用 delete 还是 set 空值?

缓存更新不是“写新值”就完事,关键是让旧值真正不可见。直接 set 新值看似简单,但若写入失败或部分成功,旧缓存仍残留;而先 deleteset,能避免脏读,但会引发缓存穿透风险。

  • 如果业务允许短暂空缓存(比如商品详情页可接受一次 DB 查询),优先 delete 后异步 set,而不是覆盖写
  • 对高并发读+低频更新的场景(如用户配置),delete 更安全:避免多个线程同时发现缓存 miss、重复回源
  • 别用 set(key, None) 模拟删除——很多缓存后端(如 Redis)对空值不自动过期,且应用层需额外判空逻辑

@lru_cache 做实例方法缓存?别踩这个引用泄漏坑

@lru_cache 绑定的是函数对象,不是调用上下文。给实例方法加它,相当于把整个 self 实例作为参数缓存键的一部分,极易导致对象无法被 GC 回收。

  • 实例方法要缓存,改用 functools.cached_property(Python 3.8+),它按实例绑定,生命周期与对象一致
  • 或手动在实例上维护字典:self._cache = {},自己控制键生成和清理
  • @lru_cache(maxsize=None) 在类方法中可用,但必须确保所有参数都是可哈希的(比如不能传 dictlist

Redis 缓存更新选 SET 还是 GETSET?看原子性需求

GETSET 看似能“取旧值+设新值”一步到位,但实际很少需要旧值;而 SET 配合 EX 参数更轻量、更可控。

笔灵降AI
笔灵降AI

论文降AI神器,适配知网及维普!一键降至安全线,100%保留原文格式;无口语化问题,文风更学术,降后字数控制最佳!

下载
  • 大多数场景直接 redis.set(key, new_value, ex=300) 就够了,简洁且支持过期时间
  • 只有当你要基于旧值做条件判断(比如“仅当旧值为 A 时才更新为 B”),才考虑 redis.eval 写 Lua 脚本,而不是依赖 GETSET
  • 注意:Python 的 redis-py 默认不启用连接池复用,高频 SET 下记得配 ConnectionPool,否则容易耗尽 socket

缓存版本号该放 key 里还是 value 里?

版本号放 key 里(如 f"user:{uid}:v2")最干脆,更新时直接切 key,老 key 自然淘汰;放 value 里(如 {"v": 2, "data": ...})要每次反序列化判断,还可能漏升级。

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

  • key 版本适合全量更新场景(如用户资料结构大改),运维可直接 KEYS user:*:v1 批量清理
  • value 版本只在极少数情况有用:比如你无法控制缓存写入方(第三方 SDK),只能靠读时兼容多版本数据
  • 别用时间戳当版本号(如 v20240501),它隐含“所有更新必须同步上线”的假设,微服务部署不同步时会出乱子

缓存策略最难的从来不是怎么写代码,而是想清楚「谁负责决定缓存是否有效」——是写操作方主动失效,还是读操作方被动校验。这个责任边界一旦模糊,问题就会藏在凌晨三点的慢查询日志里。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

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

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

287

2023.11.13

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

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

220

2023.12.29

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

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

994

2023.11.02

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

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

661

2023.11.14

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

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

496

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

406

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

404

2024.04.07

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

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