分布式锁总结

原理和场景

现在的微服务、分布式遇见的一个问题是:
在后端多个服务(一个服务分布式部署、多个微服务)中,经常会遇到临界变量的竞争,使得我们需要用分布式锁锁住临界变量,保证并发场景下逻辑的原子性

分布式锁应该具备哪些条件

在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:

1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
2、高可用的获取锁与释放锁;
3、高性能的获取锁与释放锁;
4、具备可重入特性;
5、具备锁失效机制,防止死锁;
6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

分别解释一下:
这里只是需要提供这种能力,并不是说一定要这么用分布式锁,我们完全可以根据业务去划分锁的粒度

Redis分布式锁

核心在于redis的set命令

jedis.set(key,"","nx","ex",5L);
//业务逻辑
jedis.del(key);

参数顺序依次为:key、value、key不存在才设置/key存在才设置、超时时间

设置NX: 保证只有一个线程持有锁
设置EX: 可能业务逻辑出错了,或者拿到锁的节点挂了,会导致锁永远不释放

自动续期

如果业务需要执行6S,但是超时时间设置的5S,那么就不满足条件1了
Redision有锁续期,思路就是如果是当前线程超时了,业务没有执行完,那么就给锁续期。新的时间就是看门狗的默认时间,每10秒,都会自动续期续成满时间

锁重入

思路是使用threadLocal去重试

数据库分布式锁

zookeeper分布式锁

参考

https://github.com/niceyoo/redis-redlock
https://www.cnblogs.com/liuqingzheng/p/11080501.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值