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。
一张图总结一下
热门推荐
《一万个理由》:一首歌背后的十年追梦故事
郑源新作发布:《为爱守护》与《难道爱一个人有错吗》双曲连发,再掀情歌热潮
探秘恩施大峡谷:土家族与苗族的文化交融
如何储存黄精,延长保存时间(掌握正确的方法)
黄精过期能吃吗?过期食用风险解析
圣塔菲研究所揭秘:多重病毒危机下的权衡之道
美国"四重病毒"危机:CDC如何应对这场公共卫生挑战?
解码社交媒体情感:大数据如何读懂人心
远程医疗的发展困境与突破路径:基于技术、法规与医患信任的分析
逆流而上的光:在挑战中绽放生命的璀璨
舌尖上的宋词:红莲饭的秘密
宋词里的年夜饭:从脍鱼到五辛盘,品味千年前的美食盛宴
三种养老保险到底有什么区别?一文看懂
2024年个人养老金热门产品盘点:收益高的产品有哪些?
告别暴躁:从理解到管理的全方位指南
牙周病的十大症状帮你识破!
云南保山新寨村:“咖啡+旅游”让游客更向往
冬季购车必看:如何评估汽车空调性能?
DRG/DIP支付改革下,医院如何提升管理能力?
乌龟饮食大揭秘:牛奶真的能喂吗?
过期牛奶竟成乌龟健康杀手?
牛奶不能喂乌龟?这些饮食禁忌你一定要知道!
乌龟能喝牛奶吗?过期牛奶对乌龟的危害与处理方法
广东“最委屈”的海鲜之城,不是湛江,更不是汕头,低调的不知名
桃果实中酚类物质及其生物活性的研究进展
胰腺检查做什么检查
2024年深圳房屋装修保险全攻略及小散工程备案流程解析:一站式安全装修指南
墙面为什么总开裂?12招预防和补救!
枕头可以放洗衣机洗吗?枕头放洗衣机里洗有什么影响吗?
捕捉恩施大峡谷最美瞬间:云龙地缝&沐抚瀑布摄影指南