分布式锁的几种实现方式:

这篇具有很好参考价值的文章主要介绍了分布式锁的几种实现方式:。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:通过redis实现

redis是基于单线程,在某个时刻只会有一个线程执行命令,可以利用set原子性的操作,配合set nx(RedisStringCommands.SetOption.SET_IF_ABSENT) ,这样,当多个线程或多个节点尝试获取锁时,只有一个可以成功,其他的会因为锁已存在而获取失败。这种方式通过 Redis 来实现分布式锁,可以确保在不同的应用实例或节点之间同步对共享资源的访问,从而避免并发冲突。
优点:实现简单,在内存的中获取的锁,很快。


缺点:锁有点重,对AB俩个线程,A在某一时刻获取了锁,B线程只能等待。B线程需要阻塞。
可能出现的问题:会造成死锁的情况,当A竞争到了锁,如果A在此刻由于内部异常造成A挂了,没有释放掉锁,就会造成B死锁。


死锁处理方案:
1、设置一个key的TTL过期时间。
2、处理完之后,主动将锁释放(将key del掉)
3、当然除了以上俩种常用的处理方式还可以使用乐观锁的处理方式。乐观锁通过维护一个版本号,如果版本号和锁的版本号一直即可获得锁,和其他的乐观锁类似,乐观锁在一定程度上可以防止死锁,但也会存在缺点:系统必要的开销会增大,若版本号不一致,会一直比对版本号,若锁被频繁抢夺可能对系统的性能产生影响。
4、使用红锁redLock,基本思想:在多个redis节点中,使用全局唯一的key,设置不同的value(可以为uuid、时间戳等),当set的value和携带的value大部分节点的值一致则说明获取到锁成功。(为啥要大部分,不要完全?因为在不同的节点setkey可能会有网络延迟,时钟漂移等情况。或者极端情况下,高并发多个节点同时set成功)

二、通过MQ实现

1、可以通过设置MQ队列

channel.queueDeclare("myLockQueue", false, true, false, arguments);

将参数设置 exclusive=truedurable=false,确保它是一个独占队列只能有一个连接且非持久化的队列。

在绑定了此队列的消费者,获取锁的时候,在同一时刻只能有一个消费者能够去消费此队列里面的消息,在消费者消费完之后就将队列的里面的锁重新publish上去。等待第二个消费者进行消费。

锁的产生:

  • 当一个消费者需要获取锁时,它向队列发送一个消息,表示它要获取锁。
  • 由于队列是独占的,同一时刻只能有一个消费者能够消费队列中的消息。

锁的释放:

当获取到锁的消费者获取到之后,就重新将“锁”消息publish上去,等待下一个消费者获取。

基于MQ的方式实现的分布式锁也会产生一些问题:

1、当消息丢失了,如果时在消费者消费完之后往队列里面添加释放锁的消息,消息没有推送到队列里面去,就会造成其他已经进入队列想要获取到锁的消费者进行死锁或者锁无法释放。基于这种问题的解决方案可以使用重试机制,在一定次数的重试方式避免引发上述问题。

2、在并发的场景下,由于MQ的消息是异步的,本身在获取锁的时候就会带来时间的延迟问题,某个消息丢失,消费者A和消费者B在处理的消息时,消息的状态不一致,导致消费者A误以为拿到了锁,而继续业务逻辑操作。文章来源地址https://www.toymoban.com/news/detail-802362.html

到了这里,关于分布式锁的几种实现方式:的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis——》Redis的部署方式对分布式锁的影响

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月10日
    浏览(49)
  • 分布式锁的实现(redis)

    1、单机锁 考虑在并发场景并且存在竞态的状况下,我们就要实现同步机制了,最简单的同步机制就是加锁。 加锁可以帮我们锁住资源,如内存中的变量,或者锁住临界区(线程中的一段代码),使得同一个时刻只有一个线程能访问某一个区域。 如果是单实例(单进程部署),那

    2024年02月12日
    浏览(49)
  • Java中常见的几种分布式锁介绍及实战应用

    场景描述 锁 在JAVA中是一个非常重要的概念,尤其是在当今的互联网时代,高并发的场景下,更是离不开锁。那么锁到底是什么呢?在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁旨在强制实施互斥排他、并发

    2023年04月17日
    浏览(74)
  • ZooKeeper分布式锁的实现与应用

    ZooKeeper是一种分布式应用程序协调服务,它可以管理大规模的集群,并提供可靠的、有序的、高效的数据通信。其中,ZooKeeper提供的分布式锁是一种常见的分布式锁实现,本文将对其进行详细介绍。 在分布式系统中,多个进程或节点可能需要同时访问共享资源。为了确保数据

    2024年02月02日
    浏览(39)
  • 高并发缓存问题分析以及分布式锁的实现

    在高并发的环境下,比如淘宝,京东不定时的促销活动,大量的用户访问会导致数据库的性能下降,进而有可能数据库宕机从而不能产生正常的服务,一般一个系统最大的性能瓶颈,就是数据库的io操作,如果发生大量的io那么他的问题也会随之而来。从数据库入手也是调优性价比最高

    2024年01月19日
    浏览(67)
  • 深入理解PHP+Redis实现分布式锁的相关问题

    PHP使用分布式锁,受语言本身的限制,有一些局限性。 通俗理解单机锁问题:自家的锁锁自家的门,只能保证自家的事,管不了别人家不锁门引发的问题,于是有了分布式锁。 分布式锁概念:是针对多个节点的锁。避免出现数据不一致或者并发冲突的问题,让每个节点确保

    2024年03月23日
    浏览(67)
  • 从原理到实践,分析 Redisson 分布式锁的实现方案(二)

            上篇讲解了如何用 Redis 实现分布式锁的方案,它提供了简单的原语来实现基于Redis的分布式锁。然而,Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。         Redisson是一个基于Redis的分布式Java框架。它提供了丰富的功能和工

    2024年02月15日
    浏览(45)
  • Redis实战案例14-分布式锁的基本原理、不同实现方法对比以及基于Redis进行实现思路

    基于数据库的分布式锁:这种方式使用数据库的特性来实现分布式锁。具体流程如下: 获取锁:当一个节点需要获得锁时,它尝试在数据库中插入一个特定的唯一键值(如唯一约束的主键),如果插入成功,则表示获得了锁。 释放锁:当节点完成任务后,通过删除该唯一键

    2024年02月13日
    浏览(49)
  • Zookeeper 和 Redis 哪种更好? 为什么使用分布式锁? 1. 利用 Redis 提供的 第二种,基于 ZK 实现分布式锁的落地方案 对于 redis 的分布式锁而言,它有以下缺点:

    关于这个问题,我们 可以从 3 个方面来说: 为什么使用分布式锁? 使用分布式锁的目的,是为了保证同一时间只有一个 JVM 进程可以对共享资源进行操作。 根据锁的用途可以细分为以下两类: 允许多个客户端操作共享资源,我们称为共享锁 这种锁的一般是对共享资源具有

    2024年01月16日
    浏览(46)
  • 分布式锁原理与实战三:ZooKeeper分布式锁的原理

             目录 ZooKeeper分布式锁的原理 ZooKeeper的每一个节点,都是一个天然的顺序发号器。 ZooKeeper节点的递增有序性,可以确保锁的公平 ZooKeeper的节点监听机制,可以保障占有锁的传递有序而且高效 ZooKeeper的节点监听机制,能避免羊群效应 分布式锁的抢占过程 客户端

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包