0%

redis缓存穿透、雪崩、击穿

这三个问题有个前提条件,就是使用redis作为数据库的缓存,从而减轻数据库的访问压力。

1 缓存穿透

查询一个数据库中并不存在的数据

我们在查询数据的时候先进行缓存查询,如果key不存在或者过期,再进行数据库查询,结果不为空就放进缓存,结果为空就不放进缓存。如果频繁进行空值查询那就有可能对数据库造成压力,甚至压垮数据库。

解决办法

将空值也放入缓存,只不过设置这个缓存的过期时间比较短,如60秒钟。

2 缓存雪崩

在某一时间段,缓存集中过期

缓存集中过期会使过期数据的查询压力又落到数据库上,解决时也需要根据业务场景,在创建缓存的时候尽可能的分散过期时间。并且根据数据的不同特性,适当的调节缓存时间。

其实还有一种非自然的雪崩方式是缓存服务器宕机或断网,一般采用创建多个集群实例的方式防止宕机。

3 缓存击穿

高并发访问一个key,在key失效的瞬间造成的数据库压力

比如说0点抢100块的茅台,持续时间是10分钟,程序员小王不小心把缓存过期时间配置成1分钟了。那么等到0点02分的时候,数据库被压垮了。

解决方式

根据业务场景加大热点key的缓存时间,或者让其永不过期。