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。
一张图总结一下
热门推荐
原料药GMP认证:定义、核心要求与实施意义
晚登三山还望京邑古诗赏析
如何确定客厅电视柜的合适长度?
骑行头盔真的一定要有Mips技术吗?
医师科普|深入解析呼吸性碱中毒:健康风险与应对策略
2025年跨境支付系统数字人民币应用场景与挑战
设立个人财务目标并实现目标
中国经济样本观察·“镇”了不起|超10亿双!一双鞋“踩”出500亿元大产业
【人物分析】Sans:懒惰背后的绝望与希望
儿童房装修的精细化指南
降低胆固醇的好处及4种降低胆固醇的饮食方式
我的世界虚无世界2.4.b 详细攻略大全 & 百科指南
万亿国债应急救援无人机类目推荐
情绪价值很重要什么意思
代表委员说|宋宝安:以绿色农业“开辟”农业高质量发展新路径
老人眩晕是怎么回事?常见原因及应对措施
这回还有功率焦虑吗?浅谈RTX 50系显卡的电源需求
维生素B6:您的神经保护伞、心理健康守护者!
企业监护人培训内容有哪些?全面解析各类培训课程
投标项目经理如何投标
价值投资,如何识别被低估股票的策略?
算法工程师如何确保其算法的质量和效率?
聚氨酯胶黏剂常见问题及解决方案
TPE包胶后鼓包怎么调整?
优化alt标签,让图片信息更清晰(为什么需要优化alt标签)
长期吃一片维生素C的人,最后会怎么样呢?维生素C可以天天吃吗?
英硕在英国求职如何与当地学生竞争
造浪泵能否增氧?详解造浪泵的功能与使用方法
老年痴呆治疗新突破,福建六旬女子术后认知算力明显改善
草头包子的做法与制作技巧