美文网首页
解决缓存击穿

解决缓存击穿

作者: 随风_d6a2 | 来源:发表于2022-11-15 00:25 被阅读0次

描述:某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。

缓存击穿要先看场景,什么时候会发生缓存击穿,然后再对症下药。
首先,这个缓存应该是缓存重建业务较复杂(意味着对数据库压力相对较大),可能需要查多次DB,或者SQL比较复杂。
也可能访问量极大,或者存在恶意制造大量请求(例如使用jmeter)。

现在网上博客较多的解决办法就是两种:
1、加互斥锁:在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。
2、热点数据不过期。直接将缓存设置为不过期,数据需要变更,就直接更新缓存,不删缓存。

这两种方案有利有弊,可以根据不同的场景来决定具体的方案。

举例:
1、某个数据指标,加载到缓存,每秒大量请求访问,但这个指标又是经过几张上千万级的表查询得到,这时缓存失效,大量请求直接访问到数据库,数据库很可能等崩掉。
(1)加互斥锁:如果在请求数据指标时,加互斥锁。缺点就是:缓存失效时,会损失一部分性能,一部分用户在等待。
(2)缓存设置为不失效,在影响指标的底层数据变动的地方,重新执行计算指标的方法,更新缓存。缺点:在重新计算的时间段,用户会访问到不正确的指标值。并且改动的方法会非常多。
(3)缓存设置为不失效。由定时任务去异步加载数据(例如:每两秒执行一次)。

2、双十一热卖的商品,被大量访问。如果缓存失效,某个时间点就会全部压到DB,导致DB崩掉。
可以加互斥锁,也可以缓存不失效。

相关文章

网友评论

      本文标题:解决缓存击穿

      本文链接:https://www.haomeiwen.com/subject/lirsxdtx.html