Redis 穿透 击穿 雪崩 认识

穿透
key对应的数据在库中并不存在,每次针对此key的请求从缓存获取不到,请求都会到库中,每次都会进行请求,从而可能压垮数据库.
比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
击穿:key对应的数据存在,但在redis中过期了,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端数据库进行加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。
雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如数据库)带来很大压力。

解决方案

穿透

采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。
对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

击穿

利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
也可以用判断当这个数据刚好失效时在访问时就加个条件只允许某一个数据进行访问,当缓存中有了这条数据后在允许大量数据并发访问
雪崩

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀,也可以加个随机的过期时间,这样就不会出现大批量过期事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值