缓存穿透、缓存雪崩、缓存击穿

40 阅读2分钟

一、缓存穿透

1.1 首先我们要理解什么是缓存穿透

  • 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

常见的解决方式有两种

image.png

image.png

1.2 缓存穿透产生的原因是什么?

  • 用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力

1.3 缓存穿透的解决方案有哪些?

  • 缓存null值
  • 布隆过滤
  • 增强id的复杂度,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

布隆过滤器可能存在误判的可能,因为在布隆过滤器当中不存在的二进制位一定不会通过布隆过滤器,但是即使通过了布隆过滤器的二进制位也有可能在redis和mysql当中不存在。

二、缓存雪崩

2.1 理解什么是缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

image.png

2.2 解决方案:

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性(集群)
  • 给缓存业务添加降级限流策略(springcloud里面使用的)
  • 给业务添加多级缓存(例如浏览器缓存 tomcat缓存增加多级缓存)

三、缓存击穿

3.1 什么叫缓存击穿?

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问,会在瞬间给数据库带来巨大的冲击

image.png

3.2 解决方法

常见的解决方案有两种:

  • 互斥锁
  • 逻辑过期

image.png

在线程一获得互斥锁之后,就会在线程一处开启一个新的线程。新的线程会查询数据库数据 重建缓存数据,写入缓存,重置逻辑过期时间,为什么重置过期时间呢,因为这样热点key就会又生效了。

image.png