news 2026/5/15 16:17:13

Redis缓存策略深度实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis缓存策略深度实战

Redis 缓存策略深度实战:穿透、击穿、雪崩全面解析

作者:Crown_22| AI Agent & 自动化工作流开发者 | 技术分享

前言

Redis 是后端开发的标配,但你真的会用缓存吗?

我见过太多项目,Redis 用得飞起,结果上线后各种问题:缓存穿透打爆数据库、缓存击穿导致服务雪崩、数据一致性一塌糊涂。今天我把多年实战经验分享出来,帮你避开这些坑。


一、缓存基础模式

1.1 Cache-Aside(旁路缓存)

最常见的缓存模式,读写都走应用层:

importredisimportjsonclassCacheAside:def__init__(self,redis_client,db):self.redis=redis_client self.db=dbdefget(self,key:str):# 1. 先查缓存cached=self.redis.get(key)ifcached:returnjson.loads(cached)# 2. 缓存未命中,查数据库data=self.db.query(key)ifdata:# 3. 写入缓存self.redis.setex(key,3600,# 过期时间1小时json.dumps(data))returndatadefset(self,key:str,value:dict):# 1. 更新数据库self.db.update(key,value)# 2. 删除缓存(而不是更新)self.redis.delete(key)

关键点:写的时候是删除缓存,不是更新缓存。为什么?

# ❌ 错误:更新缓存defset_wrong(self,key,value):self.db.update(key,value)self.redis.set(key,value)# 并发时可能写入脏数据# ✅ 正确:删除缓存defset_correct(self,key,value):self.db.update(key,value)self.redis.delete(key)# 下次读取时会重新加载

1.2 Read-Through / Write-Through

缓存层代理数据库操作:

classReadThroughCache:def__init__(self,redis_client,db):self.redis=redis_client self.db=dbdefget(self,key:str):cached=self.redis.get(key)ifcached:returnjson.loads(cached)# 缓存自己加载数据(对应用透明)data=self.db.query(key)self.redis.setex(key,3600,json.dumps(data))returndata

1.3 Write-Behind(异步写回)

写操作先写缓存,异步批量写入数据库:

importasynciofromcollectionsimportdefaultdictclassWriteBehindCache:def__init__(self,redis_client,db):self.redis=redis_client self.db=db self.dirty_keys=set()self.lock=asyncio.Lock()asyncdefset(self,key:str,value:dict):# 1. 写入缓存self.redis.setex(key,3600,json.dumps(value))# 2. 标记为脏数据asyncwithself.lock:self.dirty_keys.add(key)# 3. 异步批量写入数据库asyncio.create_task(self._flush_to_db())asyncdef_flush_to_db(self):asyncwithself.lock:ifnotself.dirty_keys:returnkeys_to_flush=list(self.dirty_keys)self.dirty_keys.clear()# 批量写入数据库forkeyinkeys_to_flush:data=self.redis.get(key)ifdata:self.db.update(key,json.loads(data))

二、缓存三大问题

2.1 缓存穿透

问题:查询不存在的数据,每次都穿透缓存打到数据库。

# ❌ 恶意请求不存在的IDGET/user/99999999# 数据库中不存在

解决方案1:缓存空值

defget_with_null_cache(self,key:str):cached=self.redis.get(key)ifcached=="NULL":returnNone# 空值缓存ifcached:returnjson.loads(cached)data=self.db.query(key)ifdataisNone:# 缓存空值,较短过期时间self.redis.setex(key,300,"NULL")# 5分钟else:self.redis.setex(key,3600,json.dumps(data))returndata

解决方案2:布隆过滤器

frompybloom_liveimportBloomFilterclassBloomFilterCache:def__init__(self,redis_client,db
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 16:15:39

【ROS2 速成 - Day18】机器人底盘运动控制基础(速度指令开发)

本文为【ROS2 嵌入式实战速成系列】第 18 篇,专注于从 0 到 1 实现 ROS2 对机器人底盘的运动控制。我们将从标准速度消息格式讲起,手把手编写 C 控制节点,深入对接嵌入式端电机 PID 控制逻辑,完成软硬联动的完整闭环。所有代码均可…

作者头像 李华
网站建设 2026/5/15 16:15:38

终极指南:用免费插件解决Blender到Unity的FBX导出难题

终极指南:用免费插件解决Blender到Unity的FBX导出难题 【免费下载链接】blender-to-unity-fbx-exporter FBX exporter addon for Blender compatible with Unitys coordinate and scaling system. 项目地址: https://gitcode.com/gh_mirrors/bl/blender-to-unity-…

作者头像 李华
网站建设 2026/5/15 16:14:17

3分钟掌握LunaTranslator:突破语言障碍的视觉小说实时翻译神器

3分钟掌握LunaTranslator:突破语言障碍的视觉小说实时翻译神器 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 还在为看不懂日语、英语视觉小说而烦恼吗&…

作者头像 李华
网站建设 2026/5/15 16:09:03

短路保护+过流保护+过热保护:MP9447GL-Z的车规级电源可靠性分析

MP9447GL-Z:36V/5A同步降压转换器的高密度电源方案在工业设备、通信基站以及消费电子电源适配器等应用中,电源管理单元需要同时满足宽输入电压、大输出电流和高转换效率的多重要求。传统的分立方案往往需要在PCB面积、BOM成本和散热设计之间做出权衡。MP…

作者头像 李华
网站建设 2026/5/15 16:09:03

MinGW-w64架构解密:从源码到高性能Windows原生工具链构建实战

MinGW-w64架构解密:从源码到高性能Windows原生工具链构建实战 【免费下载链接】mingw-w64 (Unofficial) Mirror of mingw-w64-code 项目地址: https://gitcode.com/gh_mirrors/mi/mingw-w64 在Windows平台上构建专业的C/C开发环境,开发者常常面临…

作者头像 李华