Redis的缓存穿透、击穿、雪崩的区别与解决方案

119 阅读2分钟

redis的缓存处理流程

image.png

1、缓存穿透

   定义:缓存击穿是指在请求时的数据即在缓存中不存在、在数据库中也不存在。导致用户每次请求
   都要去数据库中查询然后返回空。如果有恶意攻击者利用这种情况短时间内、大量的请求数据库,
   造成数据库压力很大则有可能击垮数据库系统。
   解决方案:
   1布隆过滤器
   2.对请求的参数进行数据校验,规避风险。
   3.对缓存中不存在的和数据库也不存在的数据进行空返回并更新到缓存中并把缓存的时间设置短一点
   
   

2、缓存击穿

  定义:缓存击穿是指在缓存中没有但在数据库中存在的数据,这时在请求存在大并发的情况下集中
  的访问这个key,当这个key在失效的瞬间,持续的大并发就会穿破缓存,直接请求到数据库,就像
  一个水桶被破开了一个懂。
  危害;数据库瞬间压力骤增,造成大量请求导致阻塞。
  解决方案:
  1.使用互斥锁
  2.设置热点数据永不过期

3、缓存雪崩

  定义:缓存雪崩是指缓存中大批量数据到过期时间而查询时间巨大,请求会直接落到数据库上,引
  起数据库压力过大甚至会导致数据库宕机。和缓存击穿不同的是,缓存击穿是指并发查同一条据,
  缓存雪崩是不同数据都过期了,很多数据都查不到导致查数据库。
  解决:
  1.设置热点数据永不过期。
  2.均匀过期(设置不同的过期时间,让缓存失效的时间点尽量均匀)
  3.加互斥锁(同一时间只让一个线程构建缓存,其他线程阻塞排队)
  4.双层缓存策略(主缓存:有效期按照经验值设置,设置为主读取的缓存,主缓存失效后从数据库
  加载最新值。备份缓存:有效期长,获取锁失败时读取的缓存,主缓存更新时需要同步更新备份缓存。)