跳转至

Redis-缓存穿透and缓存雪崩

缓存穿透

  • 缓存只是为了缓解服务器数据库的访问压力
  • 当从缓存中查询不到我们需要的数据就要去数据库中查询了
  • 如果被恶意攻击,恶意访问缓存中不存在以及数据库中也不存在的数据那么这个缓存就失去了意义

### 解决思路:

  1. 对于用户访问Redis缓存中没有,且Mysql中也不存在的数据,我们依然给用户返回,只不过返回null,然后给Redis缓存中给这条数据添加到缓存中,值也为null 这样用户再次而已访问不存在的数据的时候,从Redis数据库中取到数据(虽然是null但也是数据),就不会再访问Mysql数据库了
  2. 但是用户如果而已访问其他的不存在的数据,不访问这个为null的数据了这样又会产生一个问题,我们再Redis数据库中创建了值为null的key浪费空间,所以需要给每个key设置一个很短的过期时间
  3. 给用户ip限流,洪水流量对我们接口访问肯定大的1b,直接给这个ip设置限流,每分钟访问多少次多少次,或者每小时访问多少次,但是耐不住可能恶意用户有大量的ip池对我们进行洪水攻击
  4. 使用布隆控制器 #TODO---------------------------------------------

缓存雪崩

  • 缓存雪崩是指缓存不可用或者大量缓存由于超时时间相同在同一时间段失效,由于失效之后,请求在缓存无法命中数据,又开始大量的想数据库中进行访问
  • 比如某个网站搞活动,用户在12点的时候开始各种操作,每个用户生成了大量不同的缓存数据在服务器中,但是由于我们设置了过期时间,所以这些数据有在差不多的时间内集体失效,那这样大量用户访问缓存中的数据时没有又继续访问数据库,数据库大起大落......

解决思路

  1. 给缓存加上一定区间内的随机生效时间,不同的key设置不同的失效时间,避免同一时间集体失效。比如以前是设置10分钟的超时时间,那每个Key都可以随机8-13分钟过期,尽量让不同Key的过期时间不同
  2. 采用多级缓存,不同级别缓存设置的超时时间不同,即便是某个级别缓存都过期,也有其他级别缓存保底
  3. 利用加锁或者队列方式避免过多请求同时对服务器进行读写操作