尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Redis缓存雪崩、穿透、击穿,生产环境完整落地方案

Redis缓存雪崩、穿透、击穿,生产环境完整落地方案 现在几乎所有的Java微服务项目都会接入Redis做缓存优化用来减轻MySQL数据库压力、提升接口响应速度。但很多小伙伴只是简单上手使用根本没有做高并发防护处理。平时流量低的时候完全看不出问题一旦遇到活动秒杀、流量高峰就会出现数据库CPU打满、接口大面积超时、服务雪崩宕机等严重线上事故。究其根本基本都是Redis三大经典问题缓存穿透、缓存击穿、缓存雪崩导致的。这三个问题面试经常问但真正能在项目中完整落地解决方案的人并不多。今天我结合线上真实高并发项目经验用通俗的语言讲透三者区别搭配可直接上线的代码给大家一套完整、零套路的生产级解决方案。一、缓存穿透查询不存在的数据直接绕过缓存首先说最容易被攻击的缓存穿透。简单来说就是客户端大量查询数据库不存在的数据比如恶意传负数ID、随机无效参数。因为缓存中永远没有这些数据所有请求全部直接打到MySQL常规漏洞代码线上高危// 危险写法无防护极易穿透 public User getUserInfo(Long userId){ // 查询缓存不存在则查数据库 String userJson redisTemplate.opsForValue().get(user: userId); if(StringUtils.isNotEmpty(userJson)){ return JSON.parseObject(userJson, User.class); } // 不存在直接查库无任何防护 User user userMapper.selectById(userId); if(user ! null){ redisTemplate.opsForValue().set(user: userId, JSON.toJSONString(user), 30, TimeUnit.MINUTES); } return user; }如果传入大量无效userId代码会持续查库压垮数据库。生产解决方案空对象缓存 布隆过滤器小型项目直接用空对象缓存大型高并发项目搭配布隆过滤器拦截无效ID。优化后代码public User getUserInfoPro(Long userId){ String key user: userId; String userJson redisTemplate.opsForValue().get(key); // 缓存存在且不为空直接返回 if(StringUtils.isNotEmpty(userJson)){ return null.equals(userJson) ? null : JSON.parseObject(userJson, User.class); } User user userMapper.selectById(userId); if(user ! null){ redisTemplate.opsForValue().set(key, JSON.toJSONString(user), 30, TimeUnit.MINUTES); }else{ // 缓存空对象短期拦截重复无效请求 redisTemplate.opsForValue().set(key, null, 5, TimeUnit.MINUTES); } return user; }二、缓存击穿热点Key过期瞬间打爆数据库缓存击穿和穿透很容易混淆击穿针对的是热点高频Key。比如首页爆款商品、热门活动数据同一时刻几万并发请求。一旦这个热点Key缓存过期海量请求瞬间绕过缓存、直击数据库瞬间造成数据库压力飙升。最优解决方案互斥锁 热点Key永不过期对于核心热点数据我线上常用方案是Redis分布式锁限流更新避免并发查库public Goods getHotGoods(Long goodsId){ String key hot:goods: goodsId; String goodsJson redisTemplate.opsForValue().get(key); // 缓存存在直接返回 if(StringUtils.isNotEmpty(goodsJson)){ return JSON.parseObject(goodsJson, Goods.class); } // 加分布式锁只放行一个请求查库更新缓存 String lockKey lock:goods: goodsId; Boolean lock redisTemplate.opsForValue().setIfAbsent(lockKey, lock, 10, TimeUnit.SECONDS); if(!lock){ // 抢锁失败短暂休眠重试避免大量请求查库 Thread.sleep(50); return getHotGoods(goodsId); } try { // 查库更新缓存 Goods goods goodsMapper.selectById(goodsId); redisTemplate.opsForValue().set(key, JSON.toJSONString(goods), 60, TimeUnit.MINUTES); return goods; }finally { // 释放锁 redisTemplate.delete(lockKey); } }超高热度核心数据可以直接设置缓存永不过期后台定时线程异步更新彻底杜绝击穿问题。三、缓存雪崩大量Key同时过期服务集体崩盘缓存雪崩危害最大指大量缓存Key在同一时间批量失效或者Redis集群宕机导致所有流量全部打入数据库直接引发服务雪崩、连锁宕机。很多新手统一设置缓存过期时间为30分钟导致每半小时就有一批数据集体过期高峰期极易触发雪崩。核心解决方案过期时间随机打散 Redis集群 多级缓存最基础也最有效的落地方式给缓存时间加随机偏移量避免批量过期// 基础过期时间30分钟 long baseTime 30 * 60; // 随机增加1~600秒偏移量 long randomTime new Random().nextInt(600); redisTemplate.opsForValue().set(key, value, baseTime randomTime, TimeUnit.SECONDS);配合Redis主从集群、哨兵模式避免单机宕机导致整体缓存失效再叠加本地Caffeine多级缓存双重兜底彻底杜绝雪崩风险。四、三者核心区别人工总结通俗易懂很多人学完还是分不清我给大家做个极简总结 1、穿透查不存在的数据缓存、数据库都没有多为恶意攻击 2、击穿热点Key单点过期瞬时并发打垮数据库 3、雪崩大量Key集体过期/Redis宕机全局流量沦陷。五、生产环境最终落地规范结合多年线上运维经验我给团队制定了统一Redis缓存规范适配99%业务场景 1、普通业务空缓存兜底 随机过期时间防穿透、防雪崩 2、热点业务分布式锁更新 定时刷新杜绝缓存击穿 3、核心业务多级缓存 Redis集群兜底保障高可用。总结Redis缓存三大问题看似是面试八股文实则是线上高并发项目最核心的稳定性保障点。很多服务莫名宕机、数据库压力爆表根本原因就是没有做好这三层防护。不要等到线上出事故再补救开发阶段就按照这套方案落地能彻底规避缓存引发的绝大多数线上故障让服务在流量高峰期稳定运行。szls.gEvC.Com.cN1ylD.gEvC.Com.cNsAFs.gEvC.Com.cNnq5h.gEvC.Com.cN2t9q.gEvC.Com.cN1zyB.gEvC.Com.cN97op.gEvC.Com.cN5qgq.gEvC.Com.cNvj0E.gEvC.Com.cNqxnm.gEvC.Com.cNhmoo.gEvC.Com.cNrqi9.gEvC.Com.cNAjhs.gEvC.Com.cN6Cph.gEvC.Com.cNsohx.gEvC.Com.cNiupr.gEvC.Com.cNgzpt.gEvC.Com.cNpz07.gEvC.Com.cNutu4.gEvC.Com.cNhAiF.gEvC.Com.cN7rkm.gEvC.Com.cNyxiE.gEvC.Com.cNjwFz.gEvC.Com.cNsB21.gEvC.Com.cN3thE.gEvC.Com.cNxkBx.gEvC.Com.cNuiD4.gEvC.Com.cNkj7z.gEvC.Com.cN1rqm.gEvC.Com.cNxjjD.gEvC.Com.cNy5po.gEvC.Com.cNk8z2.gEvC.Com.cNhk87.gEvC.Com.cN9CEs.gEvC.Com.cNspnq.gEvC.Com.cNEzjo.gEvC.Com.cNEpBu.gEvC.Com.cNAo6E.gEvC.Com.cNkm1u.gEvC.Com.cNktoi.gEvC.Com.cNCo3y.gEvC.Com.cNqtpg.gEvC.Com.cNyhhh.gEvC.Com.cNqCD3.gEvC.Com.cN3ktA.gEvC.Com.cN60hA.gEvC.Com.cNC1wv.gEvC.Com.cN60sA.gEvC.Com.cN097i.gEvC.Com.cN5EC7.gEvC.Com.cNl2n4.gEvC.Com.cNmtqr.gEvC.Com.cNE9j2.gEvC.Com.cN7sEE.gEvC.Com.cNkwxh.gEvC.Com.cNAjnE.gEvC.Com.cNxsil.gEvC.Com.cN41zm.gEvC.Com.cN0Fk0.gEvC.Com.cN2jkm.gEvC.Com.cNpo8w.gEvC.Com.cNvv97.gEvC.Com.cNqrsp.gEvC.Com.cNDyug.gEvC.Com.cNzgx3.gEvC.Com.cNwjhj.gEvC.Com.cNz5hw.gEvC.Com.cNv1qy.gEvC.Com.cNqnx1.gEvC.Com.cNsyw0.gEvC.Com.cNzx44.gEvC.Com.cNhw5y.gEvC.Com.cN338v.gEvC.Com.cNvmyF.gEvC.Com.cNDmki.gEvC.Com.cNmth8.gEvC.Com.cNsi6h.gEvC.Com.cNson4.gEvC.Com.cN37z7.gEvC.Com.cNhm61.gEvC.Com.cN055m.gEvC.Com.cN88th.gEvC.Com.cN60py.gEvC.Com.cNxvF3.gEvC.Com.cNgh51.gEvC.Com.cNC960.gEvC.Com.cNC6q6.gEvC.Com.cNw01A.gEvC.Com.cNzlsj.gEvC.Com.cN4CBE.gEvC.Com.cNCkpm.gEvC.Com.cN59ln.gEvC.Com.cNpE1u.gEvC.Com.cNlsy2.gEvC.Com.cNi5nu.gEvC.Com.cNyCz1.gEvC.Com.cNozw9.gEvC.Com.cNojzA.gEvC.Com.cNACFu.gEvC.Com.cNok0n.gEvC.Com.cN3D2C.gEvC.Com.cNEyv7.gEvC.Com.cNwrlv.gEvC.Com.cN6nBC.gEvC.Com.cN76hp.gEvC.Com.cNjwsu.gEvC.Com.cNA7A4.gEvC.Com.cN3jqj.gEvC.Com.cN9kuy.gEvC.Com.cNEqCh.gEvC.Com.cNEx7C.gEvC.Com.cNtv6F.gEvC.Com.cNu25n.gEvC.Com.cNBoug.gEvC.Com.cNrtr9.gEvC.Com.cNjlyl.gEvC.Com.cNi38x.gEvC.Com.cNlhl4.gEvC.Com.cN0Eqp.gEvC.Com.cNh5qy.gEvC.Com.cNnyx6.gEvC.Com.cN6zqo.gEvC.Com.cNy51w.gEvC.Com.cN67zg.gEvC.Com.cNBFxq.gEvC.Com.cNDD9A.gEvC.Com.cNBllx.gEvC.Com.cNlm48.gEvC.Com.cNEz63.gEvC.Com.cN8Fr9.gEvC.Com.cN577y.gEvC.Com.cNyC5o.gEvC.Com.cN1EAg.gEvC.Com.cNm2n3.gEvC.Com.cNws5s.gEvC.Com.cNoBEl.gEvC.Com.cNqgCD.gEvC.Com.cNspyq.gEvC.Com.cNEkrm.gEvC.Com.cN5Any.gEvC.Com.cNzzy8.gEvC.Com.cNClu1.gEvC.Com.cNDn2E.gEvC.Com.cNu1pz.gEvC.Com.cNAr88.gEvC.Com.cNwzlp.gEvC.Com.cNwxpp.gEvC.Com.cNCFun.gEvC.Com.cNg913.gEvC.Com.cN4nvu.gEvC.Com.cNlhuo.gEvC.Com.cNj3oz.gEvC.Com.cNBpEB.gEvC.Com.cNmF9z.gEvC.Com.cN7zyD.gEvC.Com.cNhs5x.gEvC.Com.cN2urz.gEvC.Com.cN74ux.gEvC.Com.cN5h2A.gEvC.Com.cND9Fn.gEvC.Com.cN9gwx.gEvC.Com.cN0B6m.gEvC.Com.cNA6y7.gEvC.Com.cNFEAj.gEvC.Com.cNB1rl.gEvC.Com.cNBh0q.gEvC.Com.cNvu4m.gEvC.Com.cNmhv4.gEvC.Com.cNy2vi.gEvC.Com.cN3r5h.gEvC.Com.cNo5o4.gEvC.Com.cNCi5q.gEvC.Com.cN79r7.gEvC.Com.cNk9nm.gEvC.Com.cN6uEn.gEvC.Com.cNDgr4.gEvC.Com.cNqlvD.gEvC.Com.cNkgtm.gEvC.Com.cNClDF.gEvC.Com.cNtAqh.gEvC.Com.cNBBmv.gEvC.Com.cN14oq.gEvC.Com.cNFnmh.gEvC.Com.cN3v5i.gEvC.Com.cN1qg3.gEvC.Com.cNvkm2.gEvC.Com.cN0jBy.gEvC.Com.cNhw6n.gEvC.Com.cNgtiw.gEvC.Com.cN4qr4.gEvC.Com.cNovk8.gEvC.Com.cNluFp.gEvC.Com.cNlqlk.gEvC.Com.cNqAgD.gEvC.Com.cNsxvD.gEvC.Com.cNDCDk.gEvC.Com.cNuy20.gEvC.Com.cN6pw5.gEvC.Com.cN1gx5.gEvC.Com.cN3pAi.gEvC.Com.cNiowA.gEvC.Com.cNpso6.gEvC.Com.cNxojE.gEvC.Com.cN9i1x.gEvC.Com.cN0Ail.gEvC.Com.cN6B10.gEvC.Com.cN2AyB.gEvC.Com.cN0FgB.gEvC.Com.cNx98v.gEvC.Com.cNuy83.gEvC.Com.cNq0nx.gEvC.Com.cNxjkm.gEvC.Com.cNu38F.gEvC.Com.cN6lvy.gEvC.Com.cN86F1.gEvC.Com.cN5vhr.gEvC.Com.cNk95D.gEvC.Com.cNk4uk.gEvC.Com.cNu5rB.gEvC.Com.cNg7gk.gEvC.Com.cN65j9.gEvC.Com.cN4t0m.gEvC.Com.cN6Etq.gEvC.Com.cNw2zB.gEvC.Com.cNEohy.gEvC.Com.cN1xlp.gEvC.Com.cNpow5.gEvC.Com.cNx77C.gEvC.Com.cN4mxy.gEvC.Com.cN3p8u.gEvC.Com.cN13jx.gEvC.Com.cNosyC.gEvC.Com.cNnzw6.gEvC.Com.cNjCx0.gEvC.Com.cNBs6k.gEvC.Com.cNqq3p.gEvC.Com.cNlE0p.gEvC.Com.cNt3C5.gEvC.Com.cNFykt.gEvC.Com.cNl8Bk.gEvC.Com.cNv4E6.gEvC.Com.cN2g48.gEvC.Com.cN4sDr.gEvC.Com.cNqriC.gEvC.Com.cN8i3D.gEvC.Com.cNrF06.gEvC.Com.cNDrou.gEvC.Com.cNgouj.gEvC.Com.cNjot5.gEvC.Com.cNuq5j.gEvC.Com.cNEApm.gEvC.Com.cNzzx1.gEvC.Com.cNwynv.gEvC.Com.cNyn5h.gEvC.Com.cNl9i0.gEvC.Com.cNkCg5.gEvC.Com.cNFjor.gEvC.Com.cNvApk.gEvC.Com.cNm8Eq.gEvC.Com.cNmC2w.gEvC.Com.cNB5xB.gEvC.Com.cNnn8p.gEvC.Com.cN4l81.gEvC.Com.cN2zFj.gEvC.Com.cNlz5g.gEvC.Com.cN0ywh.gEvC.Com.cNFjoF.gEvC.Com.cNgEo1.gEvC.Com.cN9C3F.gEvC.Com.cNk91r.gEvC.Com.cNBsjq.gEvC.Com.cN6s28.gEvC.Com.cNmy1n.gEvC.Com.cNCsE7.gEvC.Com.cNg1ix.gEvC.Com.cNn7lu.gEvC.Com.cN095A.gEvC.Com.cNjD5t.gEvC.Com.cNsq7o.gEvC.Com.cNi2wr.gEvC.Com.cNnqz3.gEvC.Com.cNEEB6.gEvC.Com.cNrCED.gEvC.Com.cNsu5r.gEvC.Com.cNh6yj.gEvC.Com.cNqErq.gEvC.Com.cND5Ay.gEvC.Com.cNxFri.gEvC.Com.cN9u6w.gEvC.Com.cN270k.gEvC.Com.cNz8Es.gEvC.Com.cNkvAk.gEvC.Com.cND8zy.gEvC.Com.cNuht3.gEvC.Com.cNCyou.gEvC.Com.cNx7E5.gEvC.Com.cNpyl7.gEvC.Com.cN4khu.gEvC.Com.cNm9yq.gEvC.Com.cNl3kq.gEvC.Com.cNAw76.gEvC.Com.cNj7h9.gEvC.Com.cNhykr.gEvC.Com.cNyi01.gEvC.Com.cNq1zC.gEvC.Com.cN5yvD.gEvC.Com.cNw1lv.gEvC.Com.cNh2pr.gEvC.Com.cNgwu4.gEvC.Com.cNCrg4.gEvC.Com.cNDyD1.gEvC.Com.cNA4w1.gEvC.Com.cNs7i6.gEvC.Com.cNo3lk.gEvC.Com.cNyh1v.gEvC.Com.cNAmD2.gEvC.Com.cNn07s.gEvC.Com.cN3E4l.gEvC.Com.cNi2r9.gEvC.Com.cNBs64.gEvC.Com.cNjFzs.gEvC.Com.cNDlDn.gEvC.Com.cNEiqi.gEvC.Com.cNogxE.gEvC.Com.cN31Fn.gEvC.Com.cNBhzj.gEvC.Com.cN48DC.gEvC.Com.cNvyrg.gEvC.Com.cN0m2q.gEvC.Com.cNBFjw.gEvC.Com.cNlu20.gEvC.Com.cNrw6n.gEvC.Com.cNg3AA.gEvC.Com.cNA9th.gEvC.Com.cNiAuj.gEvC.Com.cNEjsu.gEvC.Com.cNwgvF.gEvC.Com.cNEnuh.gEvC.Com.cNol9j.gEvC.Com.cN8vFq.gEvC.Com.cN4gvl.gEvC.Com.cNrFEp.gEvC.Com.cNwxky.gEvC.Com.cNg3vv.gEvC.Com.cN2Bml.gEvC.Com.cNo1p0.gEvC.Com.cNvB5D.gEvC.Com.cNqFvu.gEvC.Com.cNnn2p.gEvC.Com.cN2uv6.gEvC.Com.cNzC29.gEvC.Com.cNw8n9.gEvC.Com.cNj38j.gEvC.Com.cN4g27.gEvC.Com.cN4pjA.gEvC.Com.cNgzCD.gEvC.Com.cNF811.gEvC.Com.cNgB43.gEvC.Com.cNpsuk.gEvC.Com.cN6uh1.gEvC.Com.cNn0g5.gEvC.Com.cNnD2C.gEvC.Com.cN8qvF.gEvC.Com.cN174h.gEvC.Com.cN2lBi.gEvC.Com.cNxghi.gEvC.Com.cNs3Ej.gEvC.Com.cN
返回列表