范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

分布式锁有哪些?

  前言
  单体架构的应用可以直接使用synchronized或者ReentrantLock就可以解决多线程资源竞争的问题。如果公司业务发展较快,可以通过部署多个服务节点来提高系统的并行处理能力。由于本地锁的作用范围只限于当前应用的线程。高并发场景下,集群中某个应用的本地锁并不会对其它应用的资源访问产生互斥,就会产生数据不一致的问题,所以分布锁就派上了用场。  常见的分布式锁应用场景
  秒杀活动、优惠券抢购、接口幂等性校验等   常用的分布式锁1. 基于数据库实现分布式锁1.1 悲观锁
  利用select … where … for update 排他锁
  注意:   其他附加功能与实现一基本一致,这里需要注意的是"where name=lock ",name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。  1.2 乐观锁
  所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才能觉察到。我们的抢购、秒杀就是用了这种实现以防止超卖。通过增加递增的版本号字段实现乐观锁  2. 基于jdk的实现方式
  思路:  另启一个服务,利用jdk并发工具来控制唯一资源,如在服务中维护一个concurrentHashMap,其他服务对某个key请求锁时,通过该服务暴露的端口,以网络通信的方式发送消息,服务端解析这个消息,将concurrentHashMap中的key对应值设为true,分布式锁请求成功,可以采用基于netty通信调用,当然你想用java的bio、nio或者整合dubbo、spring cloud feign来实现通信也没问题
  缺点:   这种方式的分布式锁看似简单,但是要考虑可用性、可靠性、效率、扩展性的话,编码难度会比较高。  3. 基于缓存实现分布式锁
  在高并发场景下,应用程序在执行过程中往往会受到网络、CPU、内存等因素的影响,所以实现一个线程安全的分布式组件,往往需要考虑很多case,这个分布式锁有 3 个重要的考量点:  互斥(只能有一个客户端获取锁)  不能死锁  容错(只要大部分 redis 节点创建了这把锁就可以)
  下面是redis分布式锁的各种实现方式和缺点,按照时间的发展排序:  3.1 直接setnx
  直接利用setnx,执行完业务逻辑后调用del释放锁,简单粗暴!
  缺点:如果setnx成功,还没来得及释放,服务挂了,那么这个key永远都不会被获取到   3.2 setnx设置一个过期时间
  为了改正第一个方法的缺陷,我们用setnx获取锁,然后用expire对其设置一个过期时间,如果服务挂了,过期时间一到自动释放
  缺点:   setnx和expire是两个方法,不能保证原子性,如果在setnx之后,还没来得及expire,服务挂了,还是会出现锁不释放的问题  3.3 set nx px
  redis官方为了解决第二种方式存在的缺点,在2.8版本为set指令添加了扩展参数nx和ex,保证了setnx+expire的原子性,使用方法:set key value ex 5 nx
  缺点:  ① 如果在过期时间内,事务还没有执行完,锁提前被自动释放,其他的线程还是可以拿到锁;② 上面所说的那个缺点还会导致当前的线程释放其他线程占有的锁  3.4 加一个事务id
  上面所说的第一个缺点,没有特别好的解决方法,只能把过期时间尽量设置的长一点,并且最好不要执行耗时任务 第二个缺点,可以理解为当前线程有可能会释放其他线程的锁,那么问题就转换为保证线程只能释放当前线程持有的锁,即setnx的时候将value设为任务的唯一id,释放的时候先get key比较一下value是否与当前的id相同,是则释放,否则抛异常回滚,其实也是变相地解决了第一个问题
  缺点:get key和将value与id比较是两个步骤,不能保证原子性   3.5 set nx px + 事务id + lua
  我们可以用lua来写一个getkey并比较的脚本,jedis/luttce/redisson对lua脚本都有很好的支持
  缺点:集群环境下,对master节点申请了分布式锁,由于redis的主从同步是异步进行的,master在内存中写入了nx之后直接返回,客户端获取锁成功,此时master节点挂了,并且数据还没来得及同步,另一个节点被升级为master,这样其他的线程依然可以获取锁   3.6 redlock
  为了解决上面提到的redis集群中的分布式锁问题,redis的作者antirez的提出了red lock的概念,假设集群中所有的n个master节点完全独立,并且没有主从同步,此时对所有的节点都去setnx,并且设置一个请求过期时间re和锁的过期时间le,同时re必须小于le(可以理解,不然请求3秒才拿到锁,而锁的过期时间只有1秒也太蠢了),此时如果有n / 2 + 1个节点成功拿到锁,此次分布式锁就算申请成功
  缺点:   可靠性还没有被广泛验证,并且严重依赖时间,好的分布式系统应该是异步的,并不能以时间为担保,程序暂停、系统延迟等都可能会导致时间错误(网上还有很多人都对这个方法提出了质疑,比如full gc发生的锁的正确性问题,但是antirez都一一作出了解答,感兴趣的同学可以去官网溜一圈!)  4. 基于zookeeper实现的分布式锁4.1. 实现方式
  ZooKeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。基于ZooKeeper实现分布式锁的步骤如下:  (1) 创建一个目录mylock;  (2) 线程A想获取锁就在mylock目录下创建临时顺序节点;  (3) 获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;  (4) 线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;  (5) 线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。  4.2. 两种利用特性实现原理:(1) 利用临时节点特性 zookeeper的临时节点有两个特性,一是节点名称不能重复,二是会随着客户端退出而销毁,因此直接将key作为节点名称,能够成功创建的客户端则获取成功,失败的客户端监听成功的节点的删除事件
  缺点:   所有客户端监听同一个节点,但是同时只有一个节点的事件触发是有效的,造成资源的无效调度  (2) 利用顺序临时节点特性 zookeeper的顺序临时节点拥有临时节点的特性,同时,在一个父节点下创建创建的子临时顺序节点,会根据节点创建的先后顺序,用一个32位的数字作为后缀,我们可以用key创建一个根节点,然后每次申请锁的时候在其下创建顺序节点,接着获取根节点下所有的顺序节点并排序,获取顺序最小的节点,如果该节点的名称与当前添加的名称相同,则表示能够获取锁,否则监听根节点下面的处于当前节点之前的节点的删除事件,如果监听生效,则回到上一步重新判断顺序,直到获取锁。
  这里推荐一个Apache的开源库Curator,它是一个ZooKeeper客户端,Curator提供的InterProcessMutex是分布式锁的实现,acquire方法用于获取锁,release方法用于释放锁。  优点:     具备高可用、可重入、阻塞锁特性,可解决失效死锁问题。   缺点:     因为需要频繁的创建和删除节点,性能上不如Redis方式。   总结1.基于数据库分布式锁实现优点:  直接使用数据库,实现方式简单。 缺点: (1)db操作性能较差,并且有锁表的风险 (2)非阻塞操作失败后,需要轮询,占用cpu资源; (3)长时间不commit或者长时间轮询,可能会占用较多连接资源 2.基于jdk的并发工具自己实现的锁优点:  不需要引入中间件,架构简单 缺点:  编写一个可靠、高可用、高效率的分布式锁服务,难度较大 3.基于redis缓存
  (1)redis set px nx + 唯一id + lua脚本  优点:  redis本身的读写性能很高,因此基于redis的分布式锁效率比较高 缺点:  依赖中间件,分布式环境下可能会有节点数据同步问题,可靠性有一定的影响,如果发生则需要人工介入 4.基于redis的redlock优点:  可以解决redis集群的同步可用性问题 缺点: (1)依赖中间件,并没有被广泛验证,维护成本高,需要多个独立的master节点;需要同时对多个节点申请锁,降低了一些效率 (2)锁删除失败 过期时间不好控制 (3)非阻塞,操作失败后,需要轮询,占用cpu资源; 5.基于zookeeper的分布式锁优点:  不存在redis的超时、数据同步(zookeeper是同步完以后才返回)、主从切换(zookeeper主从切换的过程中服务是不可用的)的问题,可靠性很高 缺点:  依赖中间件,保证了可靠性的同时牺牲了一部分效率(但是依然很高)。性能不如redis。
  综上所得:  jdk的方式不太推荐。  从理解的难易程度角度(从低到高)数据库 > 缓存 > Zookeeper  从实现的复杂性角度(从低到高)Zookeeper >= 缓存 > 数据库  从性能角度(从高到低)缓存 > Zookeeper >= 数据库  从可靠性角度(从高到低)Zookeeper > 缓存 > 数据库
  没有绝对完美的实现方式,具体要选择哪一种分布式锁,需要结合每一种锁的优缺点和业务特点而定。

华为hilink正泰智能插排,既安全,又智能!最近家里又新增了两个华为hilink智能家居生态链产品,正泰智能插排和智能插座。之所以叫智能插排插座,不仅仅是可以通过手机和智能音箱控制,更多的是它们可以让家里的老电器变的智能!上锁定今晚华为nova7系列发布会和四字弟弟一起同台互动今晚,华为nova7系列5G手机终于要与年轻消费者见面。此前数码大V的曝光,就让外界对于这款新品就很是期待了,今晚的线上发布会,将会在华为视频,爱奇艺,B站微博斗鱼等主流视频平台直荣耀30系列实锤首发麒麟985,全系,全芯,全自研布局5G市场今天荣耀方面官宣将会在4月15日正式发布荣耀的数字旗舰荣耀30系列,结合近期的曝光来看,这款5G新品十分强悍。展露出了芯片影像以及产品设计等诸多领先配置技术,而荣耀老熊刚刚实锤首发OPPOAce2到底能不能打手游发展迅速的今天,影响游戏体验已经不再是硬件,软件也是相当的重要。因此,在昨日刚刚发布的OPPOAce2中,ColorOS带来不少的优化和新技术,那么到底在日常中能够为我们带来什手机也要配独显!iQOONeo5起售价2499元黄阳发自凹非寺鹅板凳公众号ebandeng这个三月的发布会真是一场接着一场。今晚,iQOO通过一场线上发布会,在预热许久之后,正式发布了iQOONeo5。外观首先还是来看一下手机的5G手机只要998!realmeQ2系列大更新黄阳发自凹非寺鹅板凳公众号ebandeng赶在今晚苹果发布会之前,realme通过线上发布会更新了包括realmeQ2在内的一系列新品。号称王炸的realmeQ2实力到底如何,今天realme全系降价!还给618准备了两款补丁手机黄阳发自凹非寺鹅板凳公众号ebandeng赶在618年中大促之前,realme带来了两款自家产品的加强版,还对旗下一系列产品的价格进行调整,为即将到来的消费盛典做准备。Q30Pro双十一换手机买哪款好?10002000元哪几款手机性价比高?双十一将至,不少用户可能会在这段时间考虑换机,如今10002000元价位段的手机市场比较繁杂,因此选购时要注意。这个价位段建议以处理器为主要考虑点,毕竟性能才是保证手机流畅运行的关价格不贵功能齐全,VOC智能门锁X8使用评测如今智能家居概念的兴起,像门锁这种产品也开始智能化。智能门锁的一大好处就是无需携带钥匙的,可以直接用指纹或者密码开锁,十分方便。如果你经常忘记钥匙在哪,那么智能门锁就是你的救星。当南卡S2游戏蓝牙耳机,性价比实力耳机体验打游戏用蓝牙耳机总觉得有延迟,最近,南卡发布一款专业级的打游戏用的挂脖式耳机南卡S2,主要卖点就是超低延迟,到底使用的时候是什么样的,一起来体验下。包装方面就不多做赘述了,简约的黑2021年25003000哪些手机性价比高?一文教你避坑25003000价位段的手机整体配置趋向均衡,但主打拍照和轻薄的机子在处理器散热等方面还是相对拉胯。因此有游戏需求,或者重度游戏玩家,建议考虑偏向游戏设计的手机,那样使用体验会更好
决策参考华为进军办公平台市场火山小视频升级为抖音火山版Version1。0StartHTML000000538EndHTML000622101StartFragment000580517EndFragment000622033StarCreamFinance遭受第三次黑客攻击,损失超过1。3亿美元CreamFinance遭到黑客攻击,损失超过1。3亿美元。这标志着DeFi协议第三次被黑客入侵,CreamFinance是一种在以太坊网络上运行的借贷协议。2月,黑客在一次闪电贷AMC会很快推出自己的加密货币吗?AMC首席执行官AdamAron表示,该公司正在考虑推出自己的加密货币,电影院连锁店接受狗狗币支付礼品卡,并将在年底前接受额外的加密支付。今年AMC的股价在meme股票现象的支持下在过去24小时内,SOL价格上升了7SOL,在过去24小时内上升了7,成为按市值第五大cryptocurrency。ADA的价格当天上涨了2,在上周下跌了8。目前,Solana的市值超过640亿美元,而卡尔达诺的市值币圈事件比特币锚定币总锁仓量突破137亿美元,创下历史新高比特币锚定币总锁仓量突破137亿美元创下历史新高随着比特币价格重回到5万美元上方,比特币锚定币总锁仓量也上涨并创下历史新高。据DeBank数据显示比特币锚定币总锁仓量已突破137亿高杠杆再次为崩盘背锅,PlanB早已预测到这次市场底部9月7日,在比特币(BTC)价格暴跌导致数字资产跌至43,000美元以下后,交易员措手不及,这导致衍生品市场广泛清算,清算量超过35。4亿美元。由于比特币在萨尔瓦多被正式承认为法定市场总结比特币暴跌,萨尔瓦多抄底比特币比特币跌破4。6万美元,引发了数十亿的多头清算。这种波动性使萨尔瓦多的许多人对该货币的采用不那么乐观,但萨尔瓦多总统周二表示已抄底150个BTC。比特币周二大幅走低,一度从5200自从淘宝了6寸工程师电脑,转接头全丢进了垃圾桶没有GPDMicroPC以前,一直用的松下的这款10寸便携电脑(图右),这为数不多的小尺寸电脑里,自带标准网线接口,标准HDMI接口,还有VGA接口的,还算比较齐全,不过说是便携电还剩18天预售结束,8。9寸屏16GRAM,再不下手就晚了为了更好的平衡笔记本电脑在小巧便携与实用性能间的关系,GPD推出了8。9屏的超极便携笔记本电脑GPDP2Max,这是一台真正能作为主力生产力工具的便携笔记本,同时拥有强大的硬件性能6寸电脑掌上敲代码是什么体验?到手后赶紧开箱自从GPD出了专为工程师设计的6寸屏电脑MicroPC,终于找到符合我需求的产品了!之前的GPDwin和GPDPocket,前者没有键盘背光,后者抛弃了触控板。想想也是醉了,想要一我国直播电商发展动因现状与趋势研究直播电商于2016年最早由淘宝直播推出,2019年因快速发展而被称为直播电商元年,更是在2020年狂飙猛进,头部主播明星主持人明星企业家官员等纷纷走上前台直播带货。研究直播电商,需