首页 > 其他分享 >69、缓存---缓存使用---加锁解决缓存击穿问题(本地锁)

69、缓存---缓存使用---加锁解决缓存击穿问题(本地锁)

时间:2023-01-31 18:44:18浏览次数:43  
标签:缓存 数据库 查询 --- 加锁 查询数据库

方案1:使用synchronized (this)加锁(本地锁)
Springboot所有组件在容器中都是单例的,this就是我们这个serviceImpl实例,是单例的。当大量请求进行数据库查询时,由于我们加锁了,会先争夺锁。抢到锁的请求去查询数据库,其他请求等待。但是还要注意,
一个请求查询完毕后,他会存储到redis缓存中。因此其他请求进入锁后,不能盲目去查询数据库,必须先查询一下redis缓存中是否由数据。


但是当我们进行测试时,通过打印的测试数据来看,即使加了锁,在高并发的压力测试情况下,仍然查询了多次数据库,也就是没有锁住
原因如下(看我们的代码逻辑):

黑色框就是锁,我们一个线程确认缓存中没有后,去查询数据库,然后就释放锁了。(此时并没有在锁内将数据存入缓存)。当另一个线程获得锁后,也去确认缓存有没有数据,恰好没有,又去查数据库,这就导致了数据库的多次查询。因此我们修改逻辑如下:

查询完数据库后直接放入缓存,当作一个原子操作。

但是如果在分布式情况下,由于该锁是本地所,在分布式情况下仍然会有多个请求同时查询数据库。解决方案:分布式锁

标签:缓存,数据库,查询,---,加锁,查询数据库
From: https://www.cnblogs.com/morehair/p/17080181.html

相关文章