建设部执业考试网站,wordpress采集 知乎,有经验的网站建设推广,市场营销考研可以考哪些专业分布式锁闲谈
前言
服务器单机情况下#xff0c;要锁住某个资源#xff0c;我们一般用到的是synchronized#xff0c;lock等锁#xff0c;这是java提供的#xff0c;也确实能很有效的锁住资源。
但是在服务器集群的情况下#xff0c;上面这些单机锁就不起作用了#…分布式锁闲谈
前言
服务器单机情况下要锁住某个资源我们一般用到的是synchronizedlock等锁这是java提供的也确实能很有效的锁住资源。
但是在服务器集群的情况下上面这些单机锁就不起作用了你能锁住这台机器但剩下的机器都没锁就没有意义。 所以一般解决这种问题我们都用分布式锁。
分布式锁原理
分布式锁主要原理就是新增了一个第三方存储介质代替以前的synchronized。 假设服务器A对某个资源加锁后就在这个第三方介质中记录然后其他服务器再访问该资源的时候就能知道这个资源被锁住了效果就达到了。 所以也可以说这个第三方资源也可以理解成将服务器集群强行变成了一个单机服务器了。
一般情况下能担当这个第三方介质的有以下三种。
1.数据库
2.redis
3.zookeeper
1.数据库
不管集群有几个服务器都会操作一张表 所以想要加锁只需在数据库中插入一条数据即可记录这个资源的唯一标识状态为已加锁。 再有加锁的请求一查数据库已经加锁了就是没有获取到锁。
一般基于数据库的分布式锁都会考虑以下几个问题 锁的失效时间一般做法就是job定时扫删掉过期的锁但多久才算过期是一个很值得仔细研究的问题一般都是因具体业务来定 数据库的可靠性这个倒不是主要问题一般可以通过搭建集群等方式解决 数据库的效率问题毕竟数据库是读磁盘肯定没有读内存快
2.redis
这个应该是最常见的redis分布式锁。 setNx方法估计很多人都用过不多说了set if not exist 旧版本的redis加锁和设置过期时间但这样是有问题的比如加锁了但没有来得及设置过期时间服务挂了那么这个锁就死锁了 新版redis相当于将这两步合成一个方法了支持多参数这就感觉很完美啊不过我没用过可以试试应该没问题。
一般基于redis的分布式锁会考虑以下问题 锁的失效问题和数据库分布式锁一样失效时间设置多少算最优没有答案只能job异步扫一样的问题所以不能算是一个优雅的解决方案 锁是非阻塞的 成功失败都会立即返回这个要看业务怎么操作了也可以在业务上手动阻塞住这不是问题但要知道
3.zookeeper
大数据高并发一般用这个 使用临时有序节点服务器A的方法加锁就在对应方法节点上创建一个临时有序节点算是获得锁因为第一个创建的序号最小所以后面再有其他服务器想要加锁时一查自己的节点的序号不是最小所以就算没有获得锁。 因为zookeeper的临时有序节点当加锁的这个线程断掉后这个节点也自动消失那么锁也就自动释放了是不是感觉特别合适做分布式锁上面两个关于锁的失效问题用zookeeper得到了优雅的解决
一般需要注意的是 zookeeper相对复杂zookeeper算是比较重量级的甚至有些小项目都不会用到zookeeper所以也没有必要为了一个简单的分布式锁的问题强行使用zookeeper 性能问题一般和redis比性能都是弟弟
总结
在性能方面redis zookeeper 数据库 在实现的复杂度方面zookeeper redis 数据库 对于新手而言数据库 redis zookeeper 可靠性方面zookeeper redis 数据库
所以一般项目用redis分布式锁就可以了 如果对可靠性要求很高那么建议考虑zookeeper分布式锁 几乎很少用数据库分布式锁主要还是性能问题。
补充
其实分布式锁就是一个集群环境如何共享资源的问题我们看问题的角度不应该仅仅停留在分布式锁这里。很多问题的解决方案其实都是大同小异的。 比如shiro的集群session共享一般做法也是放在redis中其实和这个redis的分布式锁原理一样。 还有很多类似场景欢迎评论补充。