[学习笔记] Redis数据库之缓存穿透与雪崩

# 学习 # · 2021-10-19

缓存穿透

1、缓存穿透:在默认情况下,用户请求数据时,会先在缓存(redis)中查找,若没找到即缓存未命中,再到数据库中进行查找。一旦大量的请求数据缓存都没有命中的话,就会全部转移到数据库上,造成数据库极大的压力,就有可能导致数据库崩溃。

2、缓存穿透解决方案:

  • a、布隆过滤器:布隆过滤器是一种数据结构,对所有可能查询的参数以Hash的形式存储,以便快速确定是否存在这个值,在控制层先进行拦截校验,校验不通过直接打回,减轻了存储系统的压力。
  • b、缓存空对象:一次请求若在缓存和数据库中都没找到,就在缓存中返回一个空对象用于处理后续这个请求,但大量的空对象会耗费一定的空间。

缓存击穿

1、缓存击穿:相较于缓存穿透,缓存击穿的目的性更强。一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都汇集传到数据库,造成瞬时数据库请求量大,压力骤增。

2、缓存击穿解决方案:

  • a、设置热点数据永不过期:从缓存层面来看,没有设置过期时间,所以不会出现热点 key 过期后产生的问题。
  • b、加互斥锁(分布式锁):使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考 验很大。

缓存雪崩

1、缓存雪崩:大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时数据库请求量大,压力骤增,引起雪崩。

2、缓存雪崩的解决方案:

  • a、redis高可用:增加集群redis数量。
  • b、限流降级:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  • c、数据预热:正式部署之前,先把可能的数据先预先访问一遍,这个部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间尽量均匀。
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/320/

评论