使用锁来解决缓存击穿问题
一提起锁大家可能都想到使用synchronized或者Lock这样的锁。
在合理利用到synchronized时,springboot中的组件都是单例的,貌似没有问题,但很多的问题都出现在分布式部署上,比如有一个商品服务,被部署在了多台服务器上。
image.png
虽然每个服务都被加了锁,但是多个服务却用的不是同一把锁,所以我们要解决分布式锁的问题。
在测试这些问题时有一个小的技巧,可以在idea中将相同的服务,复制多份,然后在设置的地方设置好端口号就可以了。
image.png
当然,测试的时候就不能访问某个单独的服务了,而应该访问负载均衡设置的端口,比如:80端口
测试发现,如果启用了三个服务,会查询三次数据库,这个是不被允许的。
所以需要使用到分布式锁,以下是分布式锁的运行原理:
image.png
但是使用redis进行加锁和解锁时,还需要考虑到高并发的情况,所以可以使用redis API中的原子加锁,原子解锁。
虽然可以费一些功夫编写代码,但我们有更好的工具,所以随后学习使用工具类将代码化繁为简。
网友评论