Redis常见分布锁的原理是什么和怎么实现

常见分布式锁的实现如下图:

Redis常见分布锁的原理是什么和怎么实现

基于数据库

悲观锁

悲观锁(Pessimistic Lock)顾名思义为很悲观的锁,每次在拿数据的时候都会上锁。这样别人想拿数据就被挡住,直到悲观锁被释放,悲观锁中的共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程,但是在效率方面,处理加锁的机制会产生额外的开销,且容易产生死锁。

实现原理

悲观并发控制实际上是”先取锁再访问”的保守策略,为数据处理的安全提供了保证.

Redis常见分布锁的原理是什么和怎么实现

具体实现

例如通过悲观锁来实现库存扣减的伪代码如下:

// 对于库存记录进行行锁SELECT *FROM sys_goods s WHERE s.Id='1' FOR UPDATE;//执行库存扣减update sys_stock s set s.stockQty=s.stockQty-#{number} where s.goodId=1 and s.stockQty>0;//提交事务,自动释放悲观锁。

乐观锁

简介

乐观锁是基于数据版本号(version)的机制来实现的。数据库表添加”version”字段, 读取出数据时,将此版本号读出,在更新过程中,会对版本号进行比较,如果是一致的,则会成功执行本次操作,且版本号加1,如果版本号不一致,则会更新失败。

实现原理

相对悲观锁,乐观锁的实现不会使用到数据库的锁机制,乐观锁的原理使用的CAS的机制来实现的,CAS(Compare-and-Swap)即比较并替换.

Redis常见分布锁的原理是什么和怎么实现

  • 1、比较:读取到了一个值A,在将其更新为B之前,检查原值是否仍为A(未被其他线程改动).

  • 2、设置:如果是未发送变化,则将A更新为B结束。如果发生变化,则什么都不做。

具体实现

例如乐观锁来实现库存扣减的伪代码如下:

// 查询库存记录,获取版本号SELECT stockQty,version FROM sys_goods s WHERE s.Id='1'//执行库存扣减,防止出现超卖update sys_stock s set   s.stockQty=s.stockQty-#{number},  s.version=version+1  where s.goodId=1 and s.stockQty>0 and version=#{version};

Redis实现分布式锁

关于Redis分布式锁的实现,已经在前期的文章中进行了讲解,大家可以参考如下文章

Spring Boot 实现Redis分布式锁原理

Spring Boot 集成Redisson实现分布式锁详细案例

Zooker实现分布式锁

Zookper实现分布式锁,主要是应用zookeeper节点的临时和有序性来实现。

加锁过程

当客户端1请求时,Zookeeper客户端会创建一个持久节点Locks节点,如果客户端1想获取锁,会在locks节点下创建临时节点/node_000000,如果查找Locks下面所有临时有序子节点,当自己为最小的节点是则获取锁成功。

Redis常见分布锁的原理是什么和怎么实现

当客户端2尝试获取锁时,也会查看locks下面的临时节点,判断自己的节点/node_000001是不是最小,如果不是最小则获取锁失败,客户端2会向它排序靠前的节点node_000000注册watch事件,用来监听node_000000是否存在,虽然抢锁失败,但是node_000001进入等待状态。

Redis常见分布锁的原理是什么和怎么实现

释放锁的过程

Zookeeper的客户端业务完成或者客户端发生故障,都会删除临时节点并且释放锁。如果是任务完成,客户端1还会显式调用删除node_000000的指令。

Redis常见分布锁的原理是什么和怎么实现

例如上述图,客户端1断开,临时节点node_000000已被删除,而此时node_000001通过watcher监听发现自己为为最小的临时节点,所以获取锁成功。

异常场景分析

客户端1创建临时节点后,会与Zookeeper服务器维护一个Session,这个Session会依赖客户端 定时心跳来维持连接。由于网路异常原因,Zookeeper长时间收不到客户端1的心跳,就认为这个Session过期了,也会把这个临时节点删除,此时客户端2创建临时节点能够获取锁成功。当客户端网络恢复正常后,它仍然认为持有锁,此时就会造成锁冲突。

具体实现

Zookeeper实现分布式锁,可以采用Curator实现分布式锁,关于SpringBoot如何集成Curator,大家可以参考如下文章:

Java Spring Boot 集成Zookeeper

Zookpeer实现分布式锁实现库存扣减

 @RequestMapping("/lockStock")    public void lockStock()    {       zooKeeperUtil.lock("/Locks", 1000, TimeUnit.SECONDS, ()->{           //业务逻辑       });    }

小结:

关于分布式锁的实现的对比,详情请查看下图:

Redis常见分布锁的原理是什么和怎么实现

以上就是“Redis常见分布锁的原理是什么和怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

文章标题:Redis常见分布锁的原理是什么和怎么实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/21613

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年8月30日 下午11:24
下一篇 2022年8月30日 下午11:25

相关推荐

  • 中小团队都在用哪些不错的多人协作办公软件

    中小团队都在用哪些不错的多人协作办公软件?使用比较广泛的六大类协作软件包括:项目管理协作沟通软件,典型的有Worktile;研发管理协同软件,主流软件包括PingCode、jira;文档协同软件,主流的有Confluence、gitbook;会议协同软件,典型的有腾讯会议;设计协同软件,比如蓝湖;沟…

    2023年5月10日
    1.2K00
  • config文件有什么作用

    config文件是软件或者系统中配置文件的意思;该文件中包含了设置和配置信息以及不同的程序可以以不同的格式存储这些数据,并且不建议删除该文件,因为该文件在用户开机这段时间对计算机进行初始化设置,也就是用户对系统的设置都由该文件来对计算机进行恢复。 本教程操作环境:windows10系统、DELL G…

    2022年9月15日
    2.0K00
  • 关于远程办公,微软MVP 15年研发团队的经验分享

    为了能够应对来势汹汹的疫情,众多互联网企业纷纷开启了远程办公模式。不知道各团队前两天的远程办公效果如何,我们 Worktile 管理层在大年初四就开始讨论远程办公的事情,并且将可能出现的问题都尽量提前想到并做了准备。从这两天实际执行的情况看,我所在的研发团队执行的还不错,基本没有受到什么明显的影响。…

    2022年3月20日
    42500
  • Java多态的概念和特点是什么

    一、多态的概念 继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。参考案例如下: public class Polym…

    2022年9月1日
    44700
  • windows中raid0和raid1的区别是什么

    raid0和raid1的区别 一、概念 1、RAID 0: RAUD 0就是多磁盘数据分组同步写读。 2、RAID 1: RAID 1就是多磁盘同数据同步写读。 二、安全性 1、RAID 0: 无数据备份功能,安全性差。 2、RAID 1: 盘间是相互备份的,安全性高。 三、性能 1、RAID 0 …

    2022年9月8日
    85700
  • Nmap是如何识别主机指纹的

    0x01 Nmap维护一个nmap-os-db数据库,存储了上千种操作系统信息,简单一点来说,Nmap通过TCP/IP协议栈的指纹信息来识别目标主机的操作系统信息,这主要是利用了RFC标准中,没有强制规范了TCP/IP的某些实现,于是不同的系统中TCP/IP的实现方案可能都有其特定的方式,这些细节上…

    2022年9月21日
    1.2K00
  • windows驱动精灵drivergenius删不了如何解决

    解决方法: 1、右击桌面任务栏,点击“任务管理器”。 2、右击“drivergenius”,选择“结束任务”。 3、右击此电脑,选择“管理”。 4、点击“服务和应用程序”的下拉,选择“服务”。 5、在右侧文件中找到“Drivergenius core service”双击打开。 6、将“启动类型”改…

    2022年9月10日
    60100
  • svchost.exe可不可以关掉

    “svchost.exe”可以关掉;“svchost.exe”是一个用于加载系统服务项或者dll模块用的一个系统进程,不需要的时候可以关闭,只需在任务管理器中找到“svchost.exe”进程,右键选择“转到服务”,之后右键停止服务即可。 本教程操作环境:windows7系统、DELL G3电脑。 …

    2022年9月2日
    1.2K00
  • mysql函数的作用有哪些

    mysql函数的作用是用来实现某些功能运算和完成各种特定操作;使用函数能够允许标准组件式编程,提高了SQL语句的重用性、共享性和可移植性,可以减少重复编写程序段的工作量,提高程序的可读性,提高程序编译和运行效率,产生质量较高的目标代码。 本教程操作环境:windows10系统、mysql8.0.22…

    2022年9月6日
    64400
  • 远程代码执行漏洞实例分析

    0x01 认识 mongo-express mongo-express是一个MongoDB的Admin Web管理界面,使用NodeJS、Express、Bootstrap3编写而成。目前mongo-express应该是Github上Star非常多的MongoDB admin管理界面。部署方便,使用…

    2022年9月26日
    86900
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部