原理和场景
现在的微服务、分布式遇见的一个问题是:
在后端多个服务(一个服务分布式部署、多个微服务)中,经常会遇到临界变量的竞争,使得我们需要用分布式锁锁住临界变量,保证并发场景下逻辑的原子性
分布式锁应该具备哪些条件
在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:
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