背景:
- 分布式锁的背景(应用场景&需求&要解决的问题);
- 带来的挑战;
- 分布式的实现方式;(常见的三种);
分布式锁的要求:
功能要求
- 互斥;
- 基本要求,即同一时间最多只能有一个客户端获取锁;
- 也可以在互斥的前提现通过代码实现重入锁;
- For_Redis:setNX;
- 容错;
- 分布式锁所依赖的服务需要有容错性,保证服务的健壮性;
- For_Redis:RedLock满足健壮性;
- 分布式锁所依赖的服务需要有容错性,保证服务的健壮性;
- Hard&Soft;
- 提供Hard锁&Soft(可重试锁)多种功能模式;
- For_Redis:code实现;
- 提供Hard锁&Soft(可重试锁)多种功能模式;
实现要求
- 原子性:加锁&解锁两种操作都需要是原子操作,避免系统性出现死锁;
- None
- For_Redis:所有操作依赖需要执行Lua脚本实现,满足操作的原子性;
- None
- 权限复核:同一对加锁&解锁需要统一执行的客户端;
- 方案A:通过设置ThreadLocal级别的Value,并在解锁时进行Check;
- For_Redis:加锁时Set uuid to ThreadLocal,解锁时通过ThreadLocal Value + Lua 进行Check;
- 方案A:通过设置ThreadLocal级别的Value,并在解锁时进行Check;
注意事项
- 超时时间的控制;
- 锁假如有超时时间,则超时时间应该控制在方法可预期超时时间之上;
- 避免调用方方法还未执行完成,锁已经超时释放,导致锁的实际意义不再存在;
- 锁假如有超时时间,则超时时间应该控制在方法可预期超时时间之上;