一、是什么
缓存击穿:给某个Key设置了过期时间,key过期的时候,刚好有大量的请求过来,瞬间把数据库压垮
也就是key过期,发请求发现没有,从数据库往redis存数据的这50ms把数据库击垮
二、解决方案
解决方案1:互斥锁
流程:如果出现查询不到数据的情况,直接对该数据加锁,然后去请求db,把数据写入缓存,才释放锁,如果这个操作过程中其他线程想要获取该数据,会发现被上了锁,就休眠一会再试,直到缓存命中为止。
优点:可以保证数据的强一致性
缺点:性能比较差,所有线程都需要等到数据写入缓存才能返回数据
解决方案2:逻辑过期
所有数据加个过期字段
{"id":1,"expire":156563269}
流程:如果查询数据,发现数据已经过期,加互斥锁,开启新进程去完成从db中往缓存取数据,修改过期时间等,本进程直接返回过期数据,如果此时还有其他进程也访问该数据,但是发现加了互斥锁,直接返回过期数据。直到新线程把数据写到缓存,释放了互斥锁,线程就可以获取新数据了。
优点:高可用、性能好
缺点:返回的数据不一致
使用建议:看应用场景,如果需要高度一致,比如和钱相关的金融业务,那么必须要用互斥锁,如果为了快速响应,提高用户体验,可以用逻辑过期这种处理方式。
三、回顾
缓存穿透:查询一个不存在的数据,mysql查询不到的数据也不会直接写入缓存,导致每次请求都查数据库。
解决方案:
1、缓存空数据
2、使用布隆过滤器
缓存击穿:给某个Key设置了过期时间,key过期的时候,刚好有大量的请求过来,瞬间把数据库压垮
解决方案:
1、互斥锁
2、逻辑过期
视频地址: