Redis缓存穿透、击穿、雪崩

87 阅读2分钟

缓存雪崩:是指缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

解决方案: 方案1、也是像解决缓存穿透一样加锁排队,实现同上; 方案2、建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存; 方案3、设置缓存超时时间的时候加上一个随机的时间长度,比如这个缓存key的超时时间是固定的5分钟加上随机的2分钟,酱紫可从一定程度上避免雪崩问题;

image.png

缓存穿透: 指查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。 它拿不到数据时,是会一直查询数据库,这样会对数据库的访问造成很大的压力。

image.png

解决方案: 方案1:缓存空对象,首次请求无数据时直接缓存起来,接下来请求直接命中缓存 方案2:布隆过滤器, 要提高布隆过滤器的准确率,就要说到影响它的三个重要因素: 哈希函数的好坏 存储空间大小 哈希函数个数

缓存击穿: 热门key(经常被访问)或冷门key(不经常被访问),如果热门key缓存失效或者冷门key被删时,有大量有关这个key的访问请求, 这样会导致大并发请求直接击穿缓存,请求数据库,瞬间对数据库的访问压力增大。 原因有两个:

  1. (1)一个“冷门”key,突然被大量用户请求访问。
  2. (2)一个“热门”key,在缓存中时间恰好过期,这时有大量用户来进行访问。

解决方案:加锁,对于key过期的时候,当key要查询数据库的时候加上一把锁,这时只能让第一个请求进行查询数据库,然后把从数据库中查询到的值存储到缓存中,对于剩下的相同的key,可以直接从缓存中获取即可。 如果我们是在单机环境下:直接使用常用的锁即可(如: Lock、Synchronized等),在分布式环境下我们可以使用分布式锁,如:基于数据库、基于Redis或者zookeeper 的分布式锁。

image.png