当前位置: 首页 > 后端技术 > Java

他妈的!缓存问题太多(雪崩、击穿、穿透……)一一解决!

时间:2023-04-01 21:48:29 Java

作者:文安石来源:https://my.oschina.net/floor/...简介一个超累的下午,下班前30分钟,小航拿了一袋坚果对我说:“文哥,来,来,吃一颗坚果,开心点。”有了前几次的经验,知道这位师兄想问别的问题,婉言谢绝:“多谢好意,吃吧,我不想吃。”饿了。”小航见我有所戒备,拉出安沐希,一把抓住我的胳膊,说:“老天,我糊涂了,求求你帮帮我。”看他这么诚恳,我不好意思地说:“我不敢当大神,我的水平有限,未必能为你解开疑惑。”小航见有趣,给了我一袋坚果,眼里放光说:“哥,你可以指点我,不管是对还是错,我都愿意听。”我感动地说:“什么?有问题,我试试看。”小航立即说道:“使用缓存有什么问题?”我缓缓说道:“主要有击穿、击穿、雪崩、污染四大问题。”问题描述一一解决缓存击穿热点key。它已过期,请求命中数据库。解决方法是不设置热点key的过期时间。没有缓存穿透缓存,数据库也没有。解决方法是缓存空值或者缓存默认值来校验输入参数,阻断无效参数请求。redis中的pre-bloomfilter快速判断缓存雪崩。大量密钥同时失效。给key过期时间加一个随机数,避免同时ExpiredRedis挂掉Redis,搭建主从集群(提高redis可靠性)服务限流(限制访问,降低redis压力)服务熔断(直接返回错误,不要继续request)服务降级(redis替代,或者直接去库)缓存污染有不常用的key占用redis内存。解决方法:如果知道key,空间足够的话,直接删除Redis。可以考虑不解决。设置redis过期策略为allkey-lfu。注意是lfu,从缓存Lru中剔除访问次数最少的数据。无法解决以下场景:大量数据一次性全部读取,因为查询的数据刚刚被访问过,所以lru字段的值非常大,无法剔除不常用的key。近期热门文章汇总:1.1,000+Java面试题及答案版)2.别再满脑子if/else了,试试策略模式,真香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!