7-分布式锁

  • 分布式锁就是在分布式场景下控制共享资源访问的问题。

·
·
·

  • 依托于第三方组件实现,比如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。
    这样就保证了锁尽可能的被进程显式释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值