前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式锁分析:使用Redis实现分布式事务中的锁机制

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

原创
作者头像
攻城狮Chova
修改2021-08-24 10:28:36
6550
修改2021-08-24 10:28:36
举报
文章被收录于专栏:攻城狮Chovas攻城狮Chovas

分布式协调服务

  • Zookeeper是分布式协调服务框架
  • 分布式协调技术: 主要用来解决分布式环境当中多个进程之间的同步控制,让进程有序的去访问某种临界资源,防止造成"脏数据"的后果
  • 分布式协调技术的核心就是实现分布式锁

分布式锁

  • 分布式锁: 为了防止分布式系统中的多个进程之间相互干扰,需要分布式协调技术对进程进行调度,这个分布式协调技术的核心就是实现分布式锁

分布式锁条件

  • 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
  • 高可用的获取锁与释放锁
  • 高性能的获取锁与释放锁
  • 具备可重入特性
  • 具备锁失效机制,防止死锁
  • 具备非阻塞锁特性

分布式锁的实现

  • Zookeeper
  • Redis
  • Memcached
  • Chubby

Redis分布式锁的实现

  • 分布式锁实现的三个核心要素:加锁,解锁,锁超时
  • Redis是单线程的

加锁

  • 使用setnx命令
  • key是锁的唯一标识,按业务来决定命名
  • value可以设置成任意值
  • 当一个线程执行setnx返回1,说明key原本不存在,该线程成功得到锁.当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败

解锁

  • 当得到锁的线程执行完任务,需要释放锁,以便其它线程可以进入,使用del指令释放锁之后,其它线程就可以继续执行setnx命令获得锁

锁超时

  • 一个得到所得线程在执行任务的过程中出现问题,不能显式释放锁,这些资源将永远被锁住,造成死锁的状态undefined
  • setnx的key要设置一个超时时间,保证锁没有被显式释放时,会在一定时间后自动释放.setnx不支持超时参数,需要额外的指令expire
  • Redis分布式锁问题:
    • 非原子性操作:
      • 解决方案: 通过使用set命令set(key,value,expire) 设置为原子操作
    • 误删锁:
      • 在设置锁超时的情况下,操作没有完成,当操作完成时,del命令删除的是其它进程的锁
      • 解决方案: 判断是否为本进程的锁.带着key和value=threadID线程ID判断是否为本进程的锁
    • 在设置锁超时的情况下,操作没有完成
      • 解决方案: 释放锁时判断操作是否完成, 增加守护线程:为锁超时加时,延迟释放

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分布式协调服务
  • 分布式锁
    • 分布式锁条件
      • 分布式锁的实现
      • Redis分布式锁的实现
        • 加锁
          • 解锁
            • 锁超时
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档