redis的缓存雪崩、缓存穿透、缓存击穿

84 阅读1分钟

一、缓存击穿

1、是什么

一个请求过来,缓存中没有,数据库中有

2、解决方式

①、互斥锁(针对缓存的)

如果一个请求中缓存没有数据,那就让这个请求的另一个线程去数据库获取后放到缓存中,这个期间,其他请求处于等待,然后从缓存中获取。

②、后台续命

后台开启一个定时,为要过期的key延长过期时间。

③、永不过期

简单点,为热点key设置永不过期。

二、缓存雪崩

1、什么情况是缓存雪崩?

缓存中大多数的数据(不同的数据)的在同一时间达到过期时间,数据量比较大,这时候,缓存中没有数据,而数据库中有。请求都打到数据库上了,引起数据库压力瞬间变大。

还有一种情况是,大量的请求过来,此时缓存挂了,请求直接打到数据库上。

2、解决方式

①、加互斥锁

前面已经介绍了互斥锁,缓存雪崩可以看作多个缓存击穿。也可以采用互斥锁的方式。

②、错峰过期

就是把热点的key们的过期时间错开,不让它们的同期时间在同一时间。

③、缓存集群

这种是单机挂掉了,可以采用集群,主从、哨兵、redis-cluster。

三、缓存穿透

1、是什么?

一个请求过来,缓存中没有,数据库中也没有

2、解决方式

①、缓存空对象

就是从数据库中查询为空,那么在缓存中存储起来。其他的请求就可以从缓存中获取。