一、缓存穿透
1.1 产生原因
1.2 解决方法
接口校验
对空值进行缓存
使用布隆过滤器
实时监控
二、缓存雪崩
2.2 解决方法
将失效时间分散开
给业务添加多级缓存
构建缓存高可用集群
使用锁或者队列的方式
设置缓存标记
三、缓存击穿
3.2 解决方法
使用互斥锁
”提前“使用互斥锁 / 逻辑过期
提前对热点数据进行设置
监控数据,适时调整
3.3 实现
1 互斥锁
测试
2 逻辑过期
一、缓存穿透
1.1 产生原因
客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会访问数据库。导致DB的压力瞬间变大而卡死或者宕机。
大量的高并发的请求打在redis上
这些请求发现redis上并没有需要请求的资源,redis命中率降低
因此这些大量的高并发请求转向DB请求对应的资源
DB压力瞬间增大,直接将DB打垮,进而引发一系列“灾害”
缓存穿透发生的场景一般有两类:
原来数据是存在的,但由于某些原因(误删除、主动清理等)在缓存和数据库层面被删除了,但前端或前置的应用程序依旧保有这些数据;
恶意攻击行为,利用不存在的Key或者恶意尝试导致产生大量不存在的业务数据请求。
1.2 解决方法
接口校验
类似于用户权限的拦截,对于id = -3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。
对空值进行缓存
比如,虽然数据库中没有id = 1022的用户的数据,但是在redis中对其进行缓存(key=1022, value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上。
但需要注意:
key设置的过期时间不能太长,防止占用太多redis资源,设置一个合适的TTL,比如两三分钟。
当遇到黑客暴力请求很多不存在的数据时,就需要写入大量的null值到Redis中,可能导致Redis内存占用不足的情况。
使用布隆过滤器
布隆过滤器的基本原理:使用BitMap结构和多个哈希函数,向其中加入数据x xx时,将h a s h 1 ( x ) hash_1(x)hash
1
(x)、h a s h 2 ( x ) hash_2(x)hash
2
(x)、h a s h 3 ( x ) hash_3(x)hash
3
(x)等位置的bit值置为1。查询时,如果相应的位置均为1,则认为该数据存在于布隆过滤器中。性能较高但也有缺点:
可能会存在误判,使用时误判率可以作为参数进行设置,其实是调节了这个过程中使