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。
一张图总结一下
热门推荐
ISO 26262功能安全验证与确认详解
这才是有效的用户细分,而不是只分高中低
碳素墨水和非碳素墨水的区别
碳素墨水好还是非碳素墨水好?一文详解墨水选购指南
演讲PPT的制作之道:发言稿设置的黄金法则
如何利用人工智能背单词
春季雾霾天,如何做好空气污染防护?
父母是控制狂,脱离原生家庭的情感茧房,建立独立的自我认知体系
营业执照查询及注销指南
网上怎么查个体营业执照注销没有
银行理财产品的投资收益与通货膨胀的关系解析
SLC、MLC、TLC、QLC和PLC:最详细的对比
车辆年审流程法律指南:规范与实务
《铠甲勇士》系列世界观构成及剧情联系
川楝子的功效与作用
AI到底会“吃”掉多少电?
房贷是无限连带责任吗
《醒园录》:一部浓缩的川菜史
老人去世后,照片是烧还是留?看完你就明白了
dlp投影仪和lcd投影仪哪种好
2024年找工作怎么这么难?网工该何去何从?
别有窗外一隅幽——漫谈漏窗之美
晶振频率、脉冲、时钟周期与机械周期
玉兰花的样子和特点是什么?玉兰花的形态特征和外观描述是什么?
年假国家规定天数可以累积到下一年吗
主流 RTOS 实时操作系统介绍
跨境电商岗位职责的要求
世预赛18强赛预测出线概率出炉 国足出线仅仅7%的概率!
高压交联聚乙烯绝缘电力电缆绝缘挤制与质量控制探讨
甲溝炎的痛苦終結:如何快速緩解疼痛和感染!