赞
踩
分布式锁适用Redis的setNX【SET if Not eXists】实现,语法如下:
setNX key value
- key:锁的名称
- value:锁对应的值
- 如果Redis中没有该锁,上述语句返回1,加锁成功
- 如果Redis中已有该锁,上述语句返回0,加锁失败
- 解锁:del key
分布式系统中,节点中线程加锁成功后,在处理业务过程中宕机,分布式锁并没有释放,从而导致死锁问题
SET key value EX 10 NX
- 设置key的过期时间为10s
- 解锁:del key
过期时间释放锁问题的原因:
现存问题:
1、针对与锁过期问题
2、针对释放其他线程锁的问题
- 加锁
SET ${lockName} 唯一的ID值 EX 10 NX
- 解锁:需要使用rua脚本保证Redis操作的原子性
current_value = get ${lockName}
if ${唯一的ID值} == current_value then
DEL ${lockName}
该方案是单机版Redis的分布式系统中,分布式锁的主流解决方案
现存问题:
- 加锁
- 向所有节点发出加锁请求
- 获取锁成功的数量达到半数以上,才认为加锁成功
- 解锁:删除所有实例上的锁
现存问题:
- 加锁
- 记录 加锁时的当前时间戳t1
- 向所有节点发出加锁请求,为每一个请求设置超时时间(小于锁过期时间ttl),并记录最后收到返回的时间戳t2
- 获取锁成功数量达到半数以上,并且t2-t1 < ttl 才认为加锁成功
- 解锁:删除所有实例上的锁
上述方案就是 Redlock
(Redlock 是一种分布式锁的实现算法,是为了在Redis这类分布式键值存储系统中提供一种互斥机制而设计的。它由Redis的创建者Antirez(Salvatore Sanfilippo)提出,用于在分布式系统中安全地执行互斥操作,以确保在任何时候只有一个客户端可以持有锁。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。