分布式锁的三种实现⽅式:Zookeeper,Redis,MySQL
1.zk实现分布式锁
思路:利用zk的临时节点的唯一性,如果临时节点存在则create -e /目录 节点名 会失败,创建成功证名可以获取到锁,获取到之后执行del -e /目录 节点名 则可释放。
死循环,递归不断去尝试,直到成功。
监听节点的删除事件可以知道删除了节点
2.redis实现分布式锁
setex命令:nx和px的结合参数,就是set值并且加了过期时间,这两个命令是原子性的操作,这时间内如果第⼆个没拿到第⼀个的锁,就退出阻塞了,因为可能是客户端断连了。
加锁:
解锁:
解锁的就是⼀段Lua的拼装,把Key做了删除。你们发现没,我上⾯加锁解锁都⽤了UUID,这就是为了保证,谁加锁了谁解锁,要是你删掉了我的锁,那不乱套了嘛。LUA是原⼦性的,也⽐较简单,就是判断⼀下Key和我们参数是否相等,是的话就删除,返回成功1,0就是失败。