redis:缓存雪崩

什么是缓存雪崩?

缓存雪崩是缓存中大量的key失效或者Redis服务宕机后当高并发到来时候导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库奔溃。

造成缓存雪崩问题的原因是大量key拥有了相同的过期时间。当大量的key在同一时间过期失效后就会发生大量的请求到数据库。导致缓存雪崩。

如何解决缓存雪崩?

1.大量key失效

1、使用同步锁控制查询数据库的线程

使用同步锁控制查询数据库的线程,只允许有一个线程去查询数据库,查询得到数据后存入缓存。

Java synchronized(obj){ //查询数据库 //存入缓存 }

2、对同一类型信息的key设置不同的过期时间(TTL)

通常对一类信息的key设置的过期时间是相同的,这里可以在原有固定时间的基础上加上一个随机时间使它们的过期时间都不相同。

示例代码如下:

Java //设置过期时间300秒 redisTemplate.opsForValue().set(“course:” + courseId, JSON.toJSONString(coursePublish),300+new Random().nextInt(100), TimeUnit.SECONDS);

3、缓存预热

不用等到请求到来再去查询数据库存入缓存,可以提前将数据存入缓存。使用缓存预热机制通常有专门的后台程序去将数据库的数据同步到缓存。

2.redis宕机

  • 利用Redis集群提高服务的可用性(哨兵模式,集群模式)
  • 给缓存业务添加降级限流策略(保底策略)