分布式锁实现分析:使用 Redis 实现分布式事务中的锁机制
分布式协调服务
Zookeeper 是分布式协调服务框架
分布式协调技术: 主要用来解决分布式环境当中多个进程之间的同步控制,让进程有序的去访问某种临界资源,防止造成"脏数据"的后果
分布式协调技术的核心就是实现分布式锁
分布式锁
分布式锁: 为了防止分布式系统中的多个进程之间相互干扰,需要分布式协调技术对进程进行调度,这个分布式协调技术的核心就是实现分布式锁
分布式锁条件
在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
高可用的获取锁与释放锁
高性能的获取锁与释放锁
具备可重入特性
具备锁失效机制,防止死锁
具备非阻塞锁特性
分布式锁的实现
Zookeeper
Redis
Memcached
Chubby
Redis 分布式锁的实现
分布式锁实现的三个核心要素:加锁,解锁,锁超时
Redis 是单线程的
加锁
使用 setnx 命令
key 是锁的唯一标识,按业务来决定命名
value 可以设置成任意值
当一个线程执行 setnx 返回 1,说明 key 原本不存在,该线程成功得到锁.当一个线程执行 setnx 返回 0,说明 key 已经存在,该线程抢锁失败
解锁
当得到锁的线程执行完任务,需要释放锁,以便其它线程可以进入,使用 del 指令释放锁之后,其它线程就可以继续执行 setnx 命令获得锁
锁超时
一个得到所得线程在执行任务的过程中出现问题,不能显式释放锁,这些资源将永远被锁住,造成死锁的状态
setnx 的 key 要设置一个超时时间,保证锁没有被显式释放时,会在一定时间后自动释放.setnx 不支持超时参数,需要额外的指令 expire
Redis 分布式锁问题:
非原子性操作:
解决方案: 通过使用 set 命令 set(key,value,expire) 设置为原子操作
误删锁:
在设置锁超时的情况下,操作没有完成,当操作完成时,del 命令删除的是其它进程的锁
解决方案: 判断是否为本进程的锁.带着 key 和 value=threadID 线程 ID 判断是否为本进程的锁
在设置锁超时的情况下,操作没有完成
解决方案: 释放锁时判断操作是否完成, 增加守护线程:为锁超时加时,延迟释放
版权声明: 本文为 InfoQ 作者【攻城狮Chova】的原创文章。
原文链接:【http://xie.infoq.cn/article/6842a0f5fbf55035b8b31200e】。文章转载请联系作者。
评论