缓存穿透
定义
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生 效,这些请求都会直接打到数据库
解决方案
常见的解决方案有两种:
- 缓存空对象
- 优点:实现简单,维护方便
- 缺点:
- 额外的内存消耗
- 可能造成短期的不一致
- 布隆过滤
- 优点:内存占用少,没有多余 Key
- 缺点:
- 实现复杂
- 存在误判的可能
缓存空对象
当客户端访问不存在的数据时,先请求 Redis,但是此时 Redis 中没有数据,此时会访问数据库,但是数据库中也没有这个数据,这个数据穿透了缓存,直击数据库,数据库能承载的并发不如 Redis 那么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库
解决方案就是哪怕这个数据在数据库也不存在,也要把数据存入到 Redis 中,这样下次用户过来访问这个不存在的数据,在 Redis 中就能直接找到,就不会进入数据库了
布隆过滤器
布隆过滤器采用的是哈希的思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的数据是否存在。如果布隆过滤器判断存在,则放行,这个请求会去访问 Redis,哪怕 此时 Redis 中的数据过期了,但数据库中一定存在这个数据,在数据库中查出这个数据后,再将其放入 Redis 中;如果布隆过滤器判断这个数据不存在,则直接返回
这种方式优点在于节省内存空间,存在误判,原因是:布隆过滤器走的哈希思想,只要是哈希思想,就可能发生哈希冲突
缓存雪崩
定义
缓存雪崩是指在同一时段内大量的缓存 Key 同时失效或者 Redis 宕机,导致大量请求到达数据库,带来巨大的压力
解决方案
- 给不同 Key 的 TTL 添加随机值
- 利用 Redis 集群提供服务的可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存