Redis 缓存击穿、穿透、雪崩的原因以及解决方案
创作时间:
作者:
@小白创作中心
Redis 缓存击穿、穿透、雪崩的原因以及解决方案
引用
1
来源
1.
https://fengkui.net/articles/182
最近在使用Redis作为缓存系统时,遇到了一些问题。经过查阅资料和实践,总结出了关于Redis缓存击穿、穿透、雪崩的原因以及解决方案。
缓存雪崩
原因描述
缓存雪崩指的是大量的请求无法在Redis缓存系统中处理,请求全部打到数据库,导致数据库压力激增,甚至宕机。出现该原因主要有两种:
- 大量热点数据同时过期,导致大量请求需要查询数据库,数据库压力激增。
- Redis故障宕机,缓存系统异常。
解决方法
- 过期时间添加随机值:比如1-5分钟随机,这样的话就能保证数据不会在同一个时间大面积失效。
- 服务熔断:当从缓存获取数据发现异常,则直接返回错误数据给前端,防止所有流量打到数据库导致宕机。
- 接口限流:当访问的不是核心数据的时候,在查询的方法上加上接口限流保护。比如设置10000req/s。如果访问的是核心数据接口,缓存不存在允许从数据库中查询并设置到缓存中。这样的话,只有部分请求会发送到数据库,减少了压力。
- 提前预防:构建高可用Redis缓存集群,主从:避免单点故障
缓存击穿
原因描述
缓存击穿跟缓存雪崩有些类似,雪崩是大面积缓存失效,导致数据库崩溃,而缓存击穿是一个key是热点,不停地大并发请求,全都集中访问此key,而当此key过期瞬间,持续的大并发就击穿缓存,全都打在数据库上。
解决方法
- 把这个热点key设置为永久有效
- 使用互斥锁:这是比较常用的方法,简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去查询数据库,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutexkey,当操作返回成功时,再进行查询数据库的操作并回设缓存;否则,就重试整个get缓存的方法。
缓存穿透
原因描述
指查询一个数据库一定不存在的数据,访问的数据既不在缓存,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库是,发现数据库中也没有访问的数据。最终数据不会写入缓存。在大量请求访问数据,导致缓存和数据库产生巨大压力【缓存及数据缺失,无法写入缓存】
解决方法
- 在接口层增加校验:不合法的参数直接返回。不相信任务调用方,根据自己提供的API接口规范来,作为被调用方,要考虑可能任何的参数传值。
- 在缓存查不到,DB中也没有的情况:可以将对应的key的value写为null,或者其他特殊值写入缓存,同时将过期失效时间设置短一点,以免影响正常情况。这样是可以防止反复用同一个ID来暴力攻击。
- 正常用户是不会这样暴力功击:只有是恶意者才会这样做,可以在网关NG作一个配置项,为每一个IP设置访问阈值。
- 高级用户布隆过滤器(Bloom Filter), 这个也能很好地防止缓存穿透。原理就是利用高效的数据结构和算法快速判断出你这个Key是否在DB中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
一张图总结一下
热门推荐
芹菜榨汁要开水焯一下吗?
与晨曦同行,领略泰山旭日东升的魅力
股票期权激励:激发员工潜能与提升企业绩效的有效机制
15%首付时代,万亿城市谁将成为最大赢家?
Vue中删除对象属性的三种方法详解
汇凯金业:解读非农数据对黄金价格的影响
为啥公共厕所的门下都要空一截?原因竟是……
笔记本电脑触摸鼠标没反应怎么办,笔记本触摸板失灵维修指南
《哪吒之魔童闹海》中的特效技术:国产动漫的视觉突破
胃肠手术后为什么会出血?医生专业解析及预防建议
凡事从自己身上找原因:自我提升的智慧之道
“封神”全宇宙:跨媒介的《封神演义》
怎么分析国际汇率的趋势?这种趋势对经济有什么影响?
红圈所认可985还是五院四系?附法学红圈所认可高校名单
我国前十大苹果产地排行,中国十大名苹果产地盘点
药学与制药工程的区别
新手购表不踩坑指南:从品牌选择到功能解析
地支为丑土 八字基础之地支丑土取象
地支为丑土 八字基础之地支丑土取象
“哪吒热”对中国文化“出海”的启示
网红鼻祖芙蓉姐姐:从万民嘲笑到低调富婆,她才是最清醒的那一个
嘉兴十大特色名小吃,带你领略江南风情
AI智能体(Agent)的发展历程:初学者必备-从规则到自主智能
从神作到烂尾,《我推的孩子》为什么会产生巨大争议?
中国信托业转型:挑战与机遇并存
葛根粉的主要特點和作用
焦作高新区教育工作巡礼:从"有学上"到"上好学",从"创一流"到"创品牌"
人这一辈子,一定要去一趟独库公路!
伍六七重拾记忆,梅花十三展新招:刺客伍六七第五季第十集大结局褒贬不一
狗狗体检多少钱?不同项目费用详解与建议