什么是redis雪崩、穿透和击穿?如何解决?

redis的雪崩、穿透和击穿

一、缓存雪崩
缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部走数据库,有可能搞垮数据库,使整个服务瘫痪
使缓存集中失效的原因:
1、雪崩就是指缓存中大批量热点数据过期后系统涌入大量的查询请求,因为redis数据已经失效,请求就会渗透到数据库会导致数据库造成查询堵塞甚至宕机
2、redis宕机

 

 


 

解决办法
1、让redis数据永不过期,这种方式最可靠的,最安全的但是占空间,内存消耗大,并且不能保持数据最新,所以需要根据具体的业务逻辑来做
2、将缓存失效时间分散开,比如每个key的过期时间都是随机的,防止同一时间大量数据过期的现象发生,就不会出现同一时间全部请求都落在数据库。
3、因为redis宕机导致缓存雪崩的问题,可以启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,但是暂停了业务应用访问缓存系统,全部业务都无法正常的工作
4、创造redis集群,对数据库进行读写分离
二、缓存穿透
缓存穿透是指用户不断的发起请求访问缓存和数据库中都没有的数据,比如发起id为-1或id特别大不存在的数据,这时用户可能就是攻击者,导致数据库压力过大
解决办法
1、接口层添加校验,如用户鉴权校验;id做基础校验,指定接口的请求方式,只接受一种或几种 的请求方式。
2、对缓存取不到的数据,在数据库中也没有取到,这时可以将key-value写成key-null,缓存有效时间可以设置30秒(设置太长对导致正常情况下也无法使用),这样可以防止攻击用户反复用同一个id暴力攻击
3、布隆过滤器
三、缓存击穿
我们的业务通常会有几个数据会被频繁的访问,这类被频繁的数据称为热点数据
如果缓存中的某个热点数据过期了,此次大量的请求访问了该热点数据,无法从缓存中读取,直接访问数据库,数据库很容易被大量的请求冲垮
解决办法
1、互斥锁,保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
2、不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间。

posted @   不敲代码的Loser  阅读(6215)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示