分布式锁相关

Redis锁实现

加锁操作:set key value nx px 3000   如果成功上锁成功,如果不成功就每间隔1s 尝试去拿这把锁 

释放锁操作: lua脚本:比较当前value是否与redis中value一致,一致才删除。。

存在的问题:

1、redis宕机了,,或者主从切换数据丢了,然后锁就失效了。

2、一旦一个线程死了,如果没有设置合理的过期时间,那么就释放不了这把锁了。

Red-Lock 算法 :

这个场景假设有一个redis cluster 有5个redis master实例,然后执行以下步骤:

(1)尝试在大多数节点上建立一个锁 比如5个节点要求3个节点都成功了

(2)锁建立失败了 要一次删除这个锁

(3)只要别人建立了一把锁,那么其他的并发线程就要轮询去尝试获取锁。

zookeeper分布式锁实现:(创建临时节点的好处就是说这个节点挂掉了,那么这个锁不会一直释放不了)

1  尝试创建一个临时节点,临时节点并不存在,就上锁成功,

2、另一个节点创建同名的临时节点,失败后循环尝试注册一个监听器,如果监听器存在就condition.await 如果不存在就直接创建一个临时节点

3、一旦释放锁,临时节点删掉,就会通知另一个节点,调用watch的回调函数,然后把condition.notifyAll,然后这个节点就可以去创建这个临时节点

zookeeper还有一个思路是用临时顺序节点来实现。。。

1、创建lock00001,lock00002,lock0003三个顺序节点

2、判断当前锁是不是 lockList中最小的节点,如果是就上锁成功

3、如果不是最小的就监听自己前面一个节点,如果前面一个释放了就会通知此节点,你就可以执行自己的代码了。

以下是一些 Redis 分布式锁相关的面试题: 1. **Redis 分布式锁是如何实现的**:通常基于 `setnx`(SET if Not eXists)命令实现,通过设置一个唯一的键值对来表示。若键不存在则设置成功,获取到;若键已存在则设置失败,未获取到。同会设置过期间,防止死 [^2][^3]。 2. **Redisson 实现分布式锁如何合理的控制的有效长**:Redisson 提供了方法可以在加指定的有效长,在业务执行前获取并设置合理的长,要考虑业务的执行间,避免业务未执行完就过期释放 [^2]。 3. **Redisson 的这个,可以重入吗**:Redisson 实现是可重入的。可重入的意义在于防止死,比如在一些代码中一个方法内调用另一个加了相同的方法,若不可重入就会导致死,而 Redisson 能避免这种情况 [^3]。 4. **Redisson 能解决主从数据一致的问题吗**:Redisson 在 Redis 主从集群环境下,不能完全解决主从数据一致的问题。当向集群写数据,主机需要异步将数据同步给从机,若在同步之前主机宕机,可能出现死问题 [^2][^3][^5]。 5. **基于 setnx 实现分布式锁存在哪些问题**:基于 `setnx` 实现分布式锁可能存在重入问题、不可重试问题、超释放问题和主从一致性问题。重入问题指获得的线程不能再次进入相同的代码块,可能导致死;不可重试指线程获得失败后只能尝试一次;超释放可能导致业务未执行完释放,存在安全隐患;主从一致性问题指在主从集群中主机宕机可能造成数据不一致和死 [^3]。 6. **什么是 Redisson**:Redisson 是一个在 Redis 的基础上实现Java 驻内存数据网格(In - Memory Data Grid),它不仅提供了一系列的分布式Java 常用对象,还提供了许多分布式服务,其中包含各种分布式锁实现 [^3]。 7. **Redisson 实现分布式锁有什么优点**:Redisson 实现分布式锁可以解决死问题、误删问题、可重入问题和自动续期问题,还能让线程在获得失败后再次尝试获得 [^1][^3]。 ```python # 简单示例使用 Redis 命令实现基本的分布式锁 import redis r = redis.Redis(host='localhost', port=6379, db=0) # 尝试获取 lock_key = 'my_lock' lock_value = 'unique_value' # 设置,同设置过期间为 10 秒 result = r.set(lock_key, lock_value, nx=True, ex=10) if result: try: # 获得,执行业务逻辑 print("获得,执行任务") finally: # 释放 r.delete(lock_key) else: print("未获得") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值