秒杀项目之缓存穿透、缓存雪崩
- 缓存穿透
- 缓存击穿表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。这个我们在实际项目就遇到了,有些抢购活动、秒杀活动的接口API被大量的恶意用户刷,导致短时间内数据库超时了,好在数据库是读写分离,同时也有进行接口限流,hold住了。
- 解决办法
方案1、使用互斥锁排队
业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中加载数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。(这里要注意,分布式环境中要使用分布式锁,单机的话用普通的锁(synchronized、Lock)就够了);
对该方法的评价
虽从一定程度上减轻数据库压力,但是锁机制使得逻辑的复杂度增加,吞吐量也降低了
方案2、接口限流与熔断、降级
重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。
方案3、缓存同步
(即缓存一致性解决方案中)当value值为空时,一样在redis中存放key-null键值,当value有更新时,再同步到redis中
- 缓存雪崩
- 缓存雪崩:缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。
- 解决办法
方案1、也是像解决缓存穿透一样加锁排队,实现同上;
方案2、建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存;
方案3、设置缓存超时时间的时候加上一个随机的时间长度,比如这个缓存key的超时时间是固定的5分钟加上随机的2分钟,酱紫可从一定程度上避免雪崩问题;
参考链接:https://blog.csdn.net/weixin_40599674/article/details/101280754