Redis 缓存常见问题 :缓存雪崩,缓存击穿,缓存穿透,缓存预热


缓存雪崩

缓存雪崩指的是在短时间内,有大量缓存的键同时过期,由于缓存过期,导致此时所有的请求就直接查询数据库,而数据库很难抵挡这样巨大的压力,严重情况下就会导致数据库被大流量打死,直接宕机。

下面是正常的查询流程以及缓存雪崩后的查询流程
在这里插入图片描述

在这里插入图片描述

缓存雪崩的解决方法有以下几种

  1. 随机化过期时间,为了避免缓存同时过期,在设置缓存时在原有时间上添加随机时间,使失效时间分散开来
  2. 加锁排队,加锁排队可以起到缓冲的作用,防止大量请求同时操作数据库,但是也正因为如此也减少了吞吐量,导致响应时间变慢,用户体验变差。
  3. 设置二级缓存,即加入一个本地缓存作为备案,当Redis缓存失效后就暂时使用本地缓存进行代替,避免直接访问数据库。
  4. 设置热点数据永不过期,有更新操作时直接更新缓存即可

缓存击穿

缓存击穿与缓存雪崩很像,不过一个是针对大量缓存一个是针对热点缓存。

缓存击穿即当某个热点缓存突然失效,而正好对其有着大量的请求,此时这些请求就会直接向数据库进行查询,导致数据库面临巨大的压力

在这里插入图片描述
缓存击穿的解决方法有以下几种

  1. 设置热点数据永不过期,有更新操作时直接更新缓存即可
  2. 加锁排队,通过加锁来减少同一时间的访问量,缓解压力

缓存穿透

缓存穿透是指查询的数据在缓存中和数据库中都不存在,(由于主键通常都是从1开始自增,此时大量查询负数或者特别大的数据就会导致缓存穿透)。
处于容错考虑,由于这些数据在数据库中不存在,所以不会将结果保存到缓存中。而又因为缓存中没有这些数据,所以每次请求都会绕过缓存,直接向数据库查询,这就是缓存穿透
在这里插入图片描述
缓存穿透的解决方法有以下几种

  1. 参数校验,对于那些不合法的请求就直接返回空结果,不进行查询
  2. 布隆过滤器,可以根据布隆过滤器来判断数据在不在数据库,虽然布隆过滤器查询存在不一定准确,但是如果布隆过滤器中查不到,则一定说明不存在,就不会进入数据库查询
  3. 缓存空结果,将每次查询的结果进行缓存,即使查询不到的也缓存一个空结果,当有非法请求时就直接返回空结果

缓存预热

与上面三种不同,缓存预热并不是一个需要解决的问题,而是一种优化的策略,通过这种策略能够更快的响应用户的查询。

缓存预热指的是在启动系统的时候,提前将查询的结果预存到缓存中,这样用户查询时就可以直接从缓存中读取,减少了用户的等待时间
在这里插入图片描述
缓存预热的实现方法有以下三种

  1. 把需要缓存的函数写入到系统的构造函数中,这样系统就会在启动的时候自动的加载数据并缓存数据
  2. 把需要缓存的函数挂载到前端页面或者后端的接口上,手动触发缓存预热
  3. 设置定时任务,定时自动进行缓存预热

猜你喜欢

转载自blog.csdn.net/qq_35423154/article/details/108576009