一、雪崩
1.概念
 指某一时间段,缓存集中过期失效,无数的请求绕开缓存,直接访问数据库。

2.解决方案

  • redis数据永不过期,这种方式最可靠的、最安全的,但占用空间,内存消耗大,并且不能保持数据最新,所以需要根据具体的业务考虑

  • 将缓存失效的时间分散开,比如每个key的过期时间都是随机的,防止同一时间大量数据过期的现象发生,就不会出现同一时间全部请求都访问数据库

  • 可以启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,但是暂停了业务应用访问缓存系统,其它的业务都无法正常的工作

  • 创造redis集群,对数据库进行读写分离

    2.击穿
    1.概念
     大并发集中对一个点进行访问,当这个点失效瞬间,大并发穿透缓存直接访问数据库。

2.解决方案

  • 互斥锁,保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值
  • 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间

3.穿透
1.概念
 数据库和缓存中都没有一条数据,持续查询数据库,使数据库的访问压力过大

2.解决方案

  • 接口层添加校验,如用户鉴权校验;id做基础校验,指定接口的请求方式,只接受 一种或几种 的请求方式
  • 不仅在缓存取不到的数据,而且在数据库中也没有取到,这时可以将key-value写成key-null,缓存有效时间可以设置30秒(设置太长对导致正常情况下也无法使用),这样可以防止攻击用户反复用同一个id暴力攻击
  • 布隆过滤器