一 场景分析
在高并发情况下,即使对每一个 Tomcat 加了锁,也解决不了多个线程同时访问 Mysql 的问题,此时需要加一把分布式锁,在同一时刻只有一个 Tomcat 去访问 Mysql。
二 解决方案
1 使用 redisson 去解决
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.1</version>
</dependency>
2 代码参考
上面这段代码还是存在问题,如果第1个线程还没些写缓存,第2个线程就已经开始从缓存中获取数据了,那么第2个线程获取到的数据将是空,可使用下面代码进行优化。
如果第1个线程没有执行完,第2个线程就一直处于休眠,然后从 redis 获取数据的循环过程中,直到第2个线程获取到数据为止。