0%

缓存穿透、击穿、雪崩

参考链接:https://blog.csdn.net/lzy194/article/details/122231010

缓存穿透

用户请求的值在缓存中不存在,在数据库中也不存在!
带来的问题:每次请求都会去请求数据库,缓存形同虚设,请求量大的时候会给数据库带来巨大压力甚至直接整挂掉。

解决方案:

1、参数校验:如果对于请求的参数有制定的一套规范,请求到来时校验参数是否符合规范,不符合直接打回,不走数据库;
2、数据量少时,可以把数据库的所有数据直接放在缓存中,比如以 map 集合形式存放;
3、数据量大时,使用布隆过滤器
4、缓存空值,数据库查询不到值时,将该请求参数和其返回的空值放入缓存,下次请求直接从缓存读取空值。

缓存击穿

一个热点数据过期时间失效,大量的请求直接访问数据库造成数据库压力!

解决方案:

1、加锁,对热点数据请求数据库时加锁,查询成功后写入缓存;
2、定时任务自动续期;
3、设置缓存无过期时间

缓存雪崩

缓存击穿的升级版,多个热点数据到了过期时间。

缓存雪崩目前有两种:

1、有大量的热门缓存,同时失效。会导致大量的请求,访问数据库。而数据库很有可能因为扛不住压力,而直接挂掉。
2、缓存服务器 down 机了,可能是机器硬件问题,或者机房网络问题。总之,造成了整个缓存的不可用。

解决方案

1、热点 key 过期时间加随机时间,避免所有热点 key 同时失效
2、高可用架构;升级机器
3、降级
配置一些默认的兜底数据。
程序中有个全局开关,比如有 10 个请求在最近一分钟内,从 redis 中获取数据失败,则全局开关打开。后面的新请求,就直接从配置中心中获取默认的数据。