缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会达到数据库。
1)方案1:缓存空对象
在缓存中存储一个空值每次读取这个空
优点:实现简单,维护方便
缺点:造成额外的内存消耗(可以在设置缓存为null时,设置一个TTL)
可能造成短期不一致(TTL之内数据库插入了该条数据)
2)方案2:布隆过滤器
布隆过滤器是一种空间效率极高的概率性数据结构,用于判断一个元素是否属于某个集合。
数据结构组成
位数组(Bit Array):一个长度为 m 的二进制数组,初始全为 0。
哈希函数集合:k 个独立的哈希函数,每个函数能将元素映射到 \([0, m-1]\) 的范围内。
对 x 应用同样的 k 个哈希函数,得到 k 个位置。
检查这些位置的二进制位是否全为 1:
若全为 1,可能存在(可能是假阳性)。
若至少有一个为 0,一定不存在(无假阴性)。
也就是说,布隆过滤器说存在,不一定存在。说不存在,那一定不存在
所以仍然有一定的可能性会发生穿透
优点:内存占用少,没有多余key
缺点:实现复杂,存在误判可能
缓存雪崩
缓存雪崩是指在同一时段大量的缓存Key同时失效或者Redis服务宕机,导致大量请求直接到达数据库,带来巨大压力
方案
解决方案1:给不同的Key的TTL添加随机量
解决方案2:利用Redis集群提高服务的可用性
解决方案3:给缓存业务添加降级限流策略
解决方案4:给业务添加多级缓存
缓存击穿
缓存击穿问题也叫热点key问题
就是一个被高并发访问并缓存重建业务较复杂的key突然失效了,无数的请求访问会瞬间给数据库带来巨大压力。

1)方案1:互斥锁

性能较差,多个线程会互相等待
2)方案2:逻辑过期
我们给key在逻辑上加一个过期时间
对比两个解决方案的优缺点