- 分布式锁就是在分布式场景下控制共享资源访问的问题。
·
·
·
- 依托于第三方组件实现,比如redis
使用redis的setnx命令,也就是setnx key value,
setnx的原理是向缓存中加入一个key的时候,如果key不存在,则写入redis,并返回1,可以认定为获取锁了,
如果key存在,不会有任何影响,返回的是0,可以任务锁被其他进程获取。
·
·
·
- (没有主动释放,导致别人无法拿到锁)
setnx命令设置的锁一般需要设置过期时间,保证锁如果没有被显示的释放自己也能释放,从而不影响其他进程,
不考虑原子性可以使用expire来设置,如果考虑原子性就使用setnx key vallue nx ex seconds来设置,
使锁和过期时间同时设置。
·
·
·
- (把别人的删了)
但是这样还会有一个问题,就是如果锁过期释放了,当是进程A还是没有执行完,
进程B又拿到了锁,随后进程执行完之后就会把进程B的锁给释放,
这个可以通过给锁定义归属属性来解决,就是加锁的时候给其一个随机value值,在释放锁的时候判断进程的value值和锁中拿到的value值是否相等,
相等才允许释放。
·
·
·
- (存在多个进程共享资源问题)
还有一个问题就是如果进程A虽然不能删进程B的锁,但是进程B和进程A这种情况是访问了同一个资源,
这个可以通过设置自动续期来解决,类似redission的看门狗机制
也就是在设置锁的时候设置了默认过期时间30s,然后它会启动一个定时任务,每10s执行一次判断key是否还在使用,如果在那就续期成30s。
这样就保证了锁尽可能的被进程显式释放。