一、缓存穿透
1.1 首先我们要理解什么是缓存穿透?
- 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
常见的解决方式有两种
1.2 缓存穿透产生的原因是什么?
- 用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力
1.3 缓存穿透的解决方案有哪些?
- 缓存null值
- 布隆过滤
- 增强id的复杂度,避免被猜测id规律
- 做好数据的基础格式校验
- 加强用户权限校验
- 做好热点参数的限流
布隆过滤器可能存在误判的可能,因为在布隆过滤器当中不存在的二进制位一定不会通过布隆过滤器,但是即使通过了布隆过滤器的二进制位也有可能在redis和mysql当中不存在。
二、缓存雪崩
2.1 理解什么是缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
2.2 解决方案:
- 给不同的Key的TTL添加随机值
- 利用Redis集群提高服务的可用性(集群)
- 给缓存业务添加降级限流策略(springcloud里面使用的)
- 给业务添加多级缓存(例如浏览器缓存 tomcat缓存增加多级缓存)
三、缓存击穿
3.1 什么叫缓存击穿?
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问,会在瞬间给数据库带来巨大的冲击
3.2 解决方法
常见的解决方案有两种:
- 互斥锁
- 逻辑过期
在线程一获得互斥锁之后,就会在线程一处开启一个新的线程。新的线程会查询数据库数据 重建缓存数据,写入缓存,重置逻辑过期时间,为什么重置过期时间呢,因为这样热点key就会又生效了。