网站外链资源企业公司名字大全
2026/5/21 10:40:12 网站建设 项目流程
网站外链资源,企业公司名字大全,wordpress搭建好后如何在前台显示,深圳市保障性住房官网缓存击穿和缓存穿透是两个截然不同的概念#xff0c;它们发生的场景、原因和解决方案都有本质区别。 核心结论 缓存穿透#xff1a;访问一个根本不存在的数据。相当于你要找一个不存在的人#xff0c;查了通讯录#xff08;缓存#xff09;没找到#xff0c;又去翻了全市…缓存击穿和缓存穿透是两个截然不同的概念它们发生的场景、原因和解决方案都有本质区别。核心结论缓存穿透访问一个根本不存在的数据。相当于你要找一个不存在的人查了通讯录缓存没找到又去翻了全市户口本数据库还是没找到。这是“数据存在性”问题。缓存击穿访问一个存在但刚好过期的热点数据。相当于你要找市长但市长刚好在开会缓存过期导致所有电话都打到会议室数据库。这是“热点数据并发”问题。第一层缓存穿透的“庖丁解牛”攻击原理攻击者故意频繁请求一个数据库中根本不存在的数据。攻击流程请求缓存cache.get(user_9999999)-缓存未命中请求数据库SELECT * FROM users WHERE id 9999999-数据库查询为空由于数据不存在无法写入缓存或者只能缓存一个短暂的空值下一个相同请求到来重复步骤1-3造成危害数据库压力恶意请求会绕过缓存直接冲击数据库可能导致数据库宕机。资源浪费大量无效查询消耗系统资源。解决方案缓存空对象即使数据库查询为空也在缓存中存储一个空值如NULL并设置一个较短的过期时间如1-5分钟。$user$cache-get(user_.$id);if($usernull){$user$db-query(SELECT * FROM users WHERE id $id);if(!$user){// 数据库也没有缓存一个空对象避免频繁查询数据库$cache-set(user_.$id,false,300);// 缓存5分钟}else{$cache-set(user_.$id,$user,3600);}}return$user!false?$user:null;布隆过滤器在缓存前加一层布隆过滤器快速判断数据是否可能存在。如果布隆过滤器说数据不存在则直接返回不查询缓存和数据库。第二层缓存击穿的“庖丁解牛”发生场景某个热点数据如热门商品信息、明星微博在缓存中过期瞬间有大量并发请求同时到来。击穿流程热点Key缓存过期cache.get(hot_product_123)-缓存过期瞬间有数万个并发请求同时发现缓存失效数万个请求同时去查询数据库SELECT * FROM products WHERE id 123数据库瞬间承受巨大压力可能被打挂造成危害数据库雪崩热点数据的并发查询可能导致数据库连接池耗尽、CPU飙高。系统瘫痪整个服务因一个热点Key的失效而不可用。解决方案互斥锁第一个发现缓存过期的请求获取分布式锁然后查询数据库并重建缓存其他请求等待。publicfunctiongetProduct($id){$keyproduct_.$id;$product$cache-get($key);if($productnull){// 缓存失效$lockKeylock:.$key;if($cache-add($lockKey,1,10)){// 尝试获取锁// 获取锁成功查询数据库$product$db-query(SELECT * FROM products WHERE id $id);$cache-set($key,$product,3600);$cache-delete($lockKey);// 释放锁}else{// 没获取到锁等待重试或返回默认值usleep(100000);// 等待100msreturn$this-getProduct($id);// 重试}}return$product;}永不过期逻辑过期缓存不设置过期时间但值中包含逻辑过期时间。后台任务定期更新缓存。热点数据预加载在缓存过期前提前异步刷新缓存。第三层对比总结表特征缓存穿透缓存击穿攻击目标不存在的数据存在但过期的高并发数据请求性质恶意攻击或错误请求正常的用户请求并发量可能不高但持续不断瞬间高并发根本问题数据不存在性判断热点数据并发重建解决方案1. 缓存空值2. 布隆过滤器1. 互斥锁2. 逻辑过期第四层实战场景示例缓存穿透场景场景攻击者用脚本遍历用户ID/api/user/1,/api/user/2, …,/api/user/1000000结果大部分ID都不存在每次请求都穿透到数据库。缓存击穿场景场景双十一零点数万用户同时点击秒杀iPhone商品页面该商品缓存刚好在11:59:59过期。结果零点瞬间数万请求同时打向数据库查询同一商品信息。第五层还有一个缓存雪崩为了完整起见我们提一下相关的第三个概念缓存雪崩大量的缓存Key在同一时间点或时间段内集中过期导致所有请求都落到数据库上。与击穿的区别击穿是单个热点Key雪崩是大量Key同时失效。解决方案给缓存过期时间加上随机值避免同时过期。终极总结穿透查无此数据→ 用布隆过滤器或缓存空值解决击穿查热点数据但缓存刚好失效 → 用互斥锁解决雪崩大量数据缓存同时失效 → 用随机过期时间解决理解这三者的区别是设计高可用缓存架构的基础。它们虽然都导致数据库压力但病因不同治疗方案也完全不同。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询