分布式锁解决方案:
1.采用数据库乐观锁(不建议,性能不好,需要jdbc连接)
2.基于Redis实现分布式锁(setnx)
3.基于Zookeeper实现分布式锁。Zookeeper是分布式协调工具,在分布式解决方案中使用。
多个客户端(jvm),同时在zk上面创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁能够创建节点成功,谁就能拿到锁。没有创建成功的节点(jvm)就会进行等待,当释放锁的时候,采用事件通知给客户端重新获取锁的资源。
解决分布式锁的核心思路:在多台服务器集群的情况下,只能保证一个jvm进行操作。
基于redis实现分布式锁
setnx也可以存入key,如果存入key成功返回1,如果key已经存在则返回0,setnx可以做写入key操作,可以获取返回结果(0 | 1)。
多个客户端(jvm),同时在redis上面创建相同的一个key,因为redis的key是不允许重复的,只要谁创建成功就能拿到锁。没有创建key成功的jvm,就会进行等待。
setnx与set区别:
set存入成功之后返回ok,如果存在则覆盖之前的key。
setnx存入成功之后返回1,如果存在则返回0。不会覆盖
在redis中key是唯一的,不允许重复的。
如何释放锁?
在执行完操作的时候,删除操作对应的key,每个对应的key都有自己的有效期。
设置有效期目的:防止产生死锁现象。
原文地址:https://www.cnblogs.com/ming-blogs/p/10486827.html
时间: 2024-09-29 09:38:32