应用问题解决-分布式锁(LUA保证删除原子性)

问题:删除操作缺乏原子性

场景

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、加锁和解锁必须具有原子性

 

posted @ 2023-06-06 14:14  佛系粥米  阅读(56)  评论(0编辑  收藏  举报