什么是分布式锁?
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
分布式锁解决方案:
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都有自己的有效期。
设置有效期目的:防止产生死锁现象。