问题:删除操作缺乏原子性
场景
1、index1获得锁、执行具体操作、比较lock的uuid值确实和自己生成的uuid是否相等,相等则删除锁。
uuid = v1
set(lock, uuid)
uuid.equals(get("lock"))
2、但是index1执行删除前,lock刚好过期时间已经到了,被redis自动释放
3、此时index2获取锁,执行具体操作,index1删除锁,结果把index2的锁删除了【因为index1已经比较过uuid相等了所以可以删除】
LUA脚本有一定的原子性,不会被其它命令插队,可以完成一些redis事务性的操作。
LUA脚本来保证删除的原子性
1、加锁
2、lua脚本保证删除的原子性操作
分布式锁的四个条件:
1、互斥性。在任意时刻,只有一个客户端能持有锁
2、不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其它客户端能加锁
3、解铃还系铃人:加锁和解锁必须是同一个客户端,客户端不能把别人加的锁解了
4、加锁和解锁必须具有原子性
标签:加锁,uuid,删除,lock,原子,LUA,分布式,客户端 From: https://www.cnblogs.com/fxzm/p/17459032.html