Redis缓存雪崩、穿透和击穿

Redis在日常生产中大多数情况下作为某一种数据库的缓存使用,而业务中使用最多的数据库就是MySQL。MySQL+Redis是一种经典的业务数据表和缓存的使用方式。在现实之中,作为缓存的Redis就可能会出现雪崩、穿透和击穿,应该及早预防,避免发生。

穿透和击穿

先说穿透和击穿,两者字面意思相近。其实没有必要仔细区分两者,两者的本质都是缓存不起作用,导致的底层数据库被大量访问。如果非要说出两者的区别,那么应该就是“透”和“击”字的区别。
穿透:“直接过去了”,就是大量的访问没有命中缓存,不得不去访问底层数据库。
击穿:“遇到阻隔后打穿”,是命中了缓存,但因为某些原因(例如缓存失效),大量的请求去访问了底层数据库。

解决方法(包括但不限于):

  1. 对空值进行缓存,数据库中不存在的数据仍旧在缓存中进行缓存,设置一个很短的过期时间。
  2. 分布式锁,保证第一个请求可以构建出缓存,同一时间不会有大量的请求同时访问底层数据库。
  3. 可以利用冷热数据处理技术,将热点数据设置更长的过期时间。

雪崩

如果缓存在一段时间内失效,大量的请求访问底层数据库,也就是发生大规模的穿透和击穿,此时底层数据库瞬时压力过重,这就造成内存的雪崩。

解决方法(包括但不限于):

  1. 过期时间随机设置一个偏移量,这样防止同一时刻大量的缓存失效。
  2. 业务使用锁、等待队列等技术,限制读写速度,防止大量的同时访问。
  3. 业务使用本地缓存或者二级缓存,避免单一的缓存失效。

你可能感兴趣的:(Redis缓存雪崩、穿透和击穿)