一. 缓存雪崩
1. 含义
同一时刻,大量的缓存同时过期失效。
2. 产生原因和后果
(1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间。
(2). 产生后果:恰逢秒杀高峰,缓存过期,瞬间海量的QPS(每秒查询次数)直接打到DB上,如果系统架构没有熔断机制,直接将导致系统全线崩溃。
3. 处理方案
(1). 设置不同的缓存失效时间,比如可以在缓存过期时间后面加个随机数,这样就避免同一时刻缓存大量过期失效。
setRedis(key,value,time + Math.random() * 9999);
(2). 针对系统的一些热点数据, 可以设置缓存永不过期。 (或者定时更新)
(3). 设置二级缓存架构C1、C2,C1在前,C2在后,C1的缓存可以设置不同的过期时间,C2缓存与DB保持强一致性,实现数据同步。
PS:该二级缓存架构,同样也适用于解决下面的缓存击穿。
(4). 从架构层面来说:Redis做集群,将热点数据分配在不同的master上,减轻单点压力,同时master要对应多个slave,保证高可用; 系统架构要有快速熔断策略,减轻系统的压力。
二. 缓存击穿
1. 含义
某热点Key扛着大量的并发请求,当key失效的一瞬间,大量的QPS打到DB上,导致系统瘫痪。
PS:缓存击穿和缓存雪崩类似,击穿是某些热点key失效一瞬间大量请求打到DB上,缓存雪崩是指缓存面积失效导致大量请求打到DB上。所以二者的处理方案类似。
2. 处理方案
(1). 热点key过期时间后加随机数 。
(2). 热点key缓存永不过期(但是value需要开个子线程去更新)
(3). 二级缓存架构策略。(详见上面)
(4). 采用互斥锁更新,保证同一进程针对相同的数据不会并发打到DB上,从而减轻DB的压力。
(5). 缓存失效的时候随机sleep一个很短的时间,再次查询,如果失败则执行更新操作。
三. 缓存穿透
1. 含义
业务请求中数据缓存中没有,DB中也没有,导致类似请求直接跨过缓存,反复在DB中查询,与此同时缓存也不会得到更新。
举个例子:
商品表中的id是自增,并且以id为缓存的key,商品库存为value事先存在redis中。但此时过来的请求id均为负数,-1,-