特性#
- 互斥性: 锁的目的是获取资源的使用权,因此只能一个竞争者持有锁
- 安全性: 一个竞争者持有锁期间,若因为意外情况未能及时释放锁,也有兜底策略释放锁,保证其他的竞争者可以获得锁
- 对称性: 同一个锁的枷锁和解锁必须是同一个竞争者, 不能把其他竞争者的锁给释放掉了
- 可靠性: 需要一定的异常处理能力,容灾能力
实现#
set key value NX PX expire
// key 为锁标识
// value 为持锁者标识,只能持有者操作锁,非持有者不可操作,保证了**对称性**
// NX 存在则不操作,即只有第一个人操作成功,后来者操作会失败,保证了**互斥性**
// expire 设置过期时间,即使意外情况没有释放锁,也会因过期自动释放锁,保证了**安全性**若业务逻辑执行时间超过锁的过期时间,可以考虑锁续期
释放锁时,由于需要检查锁的归属及释放操作,这一过程如何保证是原子化的?#
使用 lua 脚本执行这一过程,保证原子性
至此就是一个较完善、可用的分布式锁了