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


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

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

查询完数据库后直接放入缓存,当作一个原子操作。
但是如果在分布式情况下,由于该锁是本地所,在分布式情况下仍然会有多个请求同时查询数据库。解决方案:分布式锁
分类:
谷粒商城
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律