分布式锁
步骤
加锁
- key 为资源最小锁定值,缩小互斥范围
- value 为当前线程唯一 id,防止其他线程误删锁
- 使用 setnx 命令加锁,保证线程独占
- 设置锁失效时间,防止 down 机后锁无法释放
续锁
- 加锁成功后启动看门狗线程
- 每隔 ExpiredTime/3 时间,如果锁未释放则进行续约
删锁
- 将删锁代码放在 finally 代码块内,防止程序异常导致无法删锁
- 删锁时判断 value 是否为当前线程 id,防止误删其他线程的锁
优化
- 加锁、续锁、删锁都有多条 redis 命令,使用 lua 脚本保证执行的原子性
- 分布式锁并行化优化—-读写锁、分段锁
- 集群的情况下,锁有丢失风险,需要使用 RedLock
Simple is Awesome