写点什么

分布式锁实现分析:使用 Redis 实现分布式事务中的锁机制

发布于: 2021 年 05 月 17 日
分布式锁实现分析:使用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 判断是否为本进程的锁

  • 在设置锁超时的情况下,操作没有完成

  • 解决方案: 释放锁时判断操作是否完成, 增加守护线程:为锁超时加时,延迟释放

发布于: 2021 年 05 月 17 日阅读数: 32
用户头像

一位攻城狮的自我修养 2021.04.06 加入

分享技术干货,面试题和攻城狮故事。 你的关注支持是我持续进步的最大动力! https://github.com/ChovaVea

评论

发布
暂无评论
分布式锁实现分析:使用Redis实现分布式事务中的锁机制