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

终于懂什么是分布式锁

  为什么要有分布式锁?
  模拟一个秒杀接口:
  商品表:
  单机情况下,用Jmeter发送1000个请求过来:
  由于加了sychronized进行方法同步,结果正常。
  现在模拟集群环境,还是用上面的接口,但启动两个服务,分别是8080和8081端口,用nginx负载均衡到两个tomcat,用Jmeter发送1000个请求到nginx:
  发现库存并没有-1000,并且控制的库存量打印有重复。
  结论:
  我们在系统中修改已有数据时,需要先读取,然后进行修改保存,此时很容易遇到并发问题。由于修改和保存不是原子操作,在并发场景下,部分对数据的操作可能会丢失。在单服务器系统我们常用本地锁来避免并发带来的问题,然而,当服务采用集群方式部署时,本地锁无法在多个服务器之间生效,这时候保证数据的一致性就需要分布式锁来实现。 MySql分布式锁
  基于数据库的分布式锁, 常用的一种方式是使用表的唯一约束特性。当往数据库中成功插入一条数据时, 代表只获取到锁。将这条数据从数据库中删除,则释放锁。  CREATE TABLE `database_lock` (     `id` BIGINT NOT NULL AUTO_INCREMENT,     `resource` varchar(1024) NOT NULL DEFAULT "" COMMENT "资源",     `lock_id` varchar(1024) NOT NULL DEFAULT "" COMMENT "唯一锁编码",     `count` int(11) NOT NULL DEFAULT "0" COMMENT "锁的次数,可重入锁",     PRIMARY KEY (`id`),     UNIQUE KEY `uiq_lock_id` (`lock_id`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="数据库分布式锁表";
  当我们想要获得锁时,可以插入一条数据
  INSERT INTO database_lock(resource,lock_id,count) VALUES ("resource","lock_id",1);
  注意:在表database_lock中,lock_id字段做了唯一性约束,可以是机器的mac地址+线程编号,这样如果有多个请求同时提交到数据库的话,数据库可以保证只有一个操作可以成功(其它的会报错:ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘uiq_lock_id’),那么我们就可以认为操作成功的那个请求获得了锁。
  当需要释放锁的时,可以删除这条数据:
  DELETE FROM database_lock where method_name ="resource" and cust_id = "lock_id"
  可重入锁:
  UPDATE database_lock SET count = count + 1 WHERE method_name ="resource" AND cust_id = "lock_id"
  伪代码:public void test(){     String resource = "resource";  String lock_id = "lock_id";  if(!checkReentrantLock(resource,lock_id)){         lock(resource,lock_id);//加锁  }else{         reentrantLock(resource,lock_id); //可重入锁+1  }     //业务处理  unlock(resource,lock_id);//释放锁 }
  这种实现方式非常的简单,但是需要注意以下几点:这种锁没有失效时间,一旦释放锁的操作失败就会导致锁记录一直在数据库中,其它线程无法获得锁。这个缺陷也很好解决,比如可以做一个定时任务去定时清理。这种锁的可靠性依赖于数据库。建议设置备库,避免单点,进一步提高可靠性。这种锁是非阻塞的,因为插入数据失败之后会直接报错,想要获得锁就需要再次操作。如果需要阻塞式的,可以弄个for循环、while循环之类的,直至INSERT成功再返回。这种锁也是非可重入的,因为同一个线程在没有释放锁之前无法再次获得锁,因为数据库中已经存在同一份记录了。想要实现可重入锁,可以在数据库中添加一些字段,比如获得锁的主机信息、线程信息等,那么在再次获得锁的时候可以先查询数据,如果当前的主机信息和线程信息等能被查到的话,可以直接把锁分配给它。Redis分布式锁
  Redis 锁主要利用 Redis 的 setnx 命令。加锁命令:SETNX key value,当键不存在时,对键进行设置操作并返回成功,否则返回失败。KEY 是锁的唯一标识,一般按业务来决定命名。解锁命令:DEL key,通过删除键值对释放锁,以便其他线程可以通过 SETNX 命令来获取锁。锁超时:EXPIRE key timeout, 设置 key 的超时时间,以保证即使锁没有被显式释放,锁也可以在一定时间后自动释放,避免资源被永远锁住。if (setnx(key, 1) == 1){     expire(key, 30)     try {         //TODO 业务逻辑     } finally {         del(key)     } }
  使用SpingBoot集成Redis后使用分布式锁:
  可以看到打印的日志不再有重复的库存量,最小的库存量与数据库中的一致。
  Redis分布式锁可能存在一些问题:
  1.设置过期时间
  A客户端获取锁成功,但是在释放锁之前崩溃了,此时该客户端实际上已经失去了对公共资源的操作权,但却没有办法请求解锁(删除 Key-Value 键值对),那么,它就会一直持有这个锁,而其它客户端永远无法获得锁。
  在加锁时为锁设置过期时间,当过期时间到达,Redis 会自动删除对应的 Key-Value,从而避免死锁。
  2.SETNX 和 EXPIRE 非原子性
  如果SETNX成功,在设置锁超时时间之前,服务器挂掉、重启或网络问题等,导致EXPIRE命令没有执行,锁没有设置超时时间变成死锁。Redis 2.6.12 之后 Redis 支持 nx 和 ex 操作是同一原子操作。
  3.锁误解除
  如果线程 A 成功获取到了锁,并且设置了过期时间 30 秒,但线程 A 执行时间超过了 30 秒,锁过期自动释放,此时线程 B 获取到了锁;随后 A 执行完成,线程 A 使用 DEL 命令来释放锁,但此时线程 B 加的锁还没有执行完成,线程 A 实际释放的线程 B 加的锁。
  通过在 value 中设置当前线程加锁的标识,在删除之前验证 key 对应的 value 判断锁是否是当前线程持有。可生成一个 UUID 标识当前线程
  4.超时解锁导致并发
  如果线程 A 成功获取锁并设置过期时间 30 秒,但线程 A 执行时间超过了 30 秒,锁过期自动释放,此时线程 B 获取到了锁,线程 A 和线程 B 并发执行。
  一般有两种方式解决该问题:
  将过期时间设置足够长,确保代码逻辑在锁释放之前能够执行完成。
  为获取锁的线程增加守护线程,为将要过期但未释放的锁增加有效时间。
  更好的方法是是使用Redission,WatchDog机制会为将要过期但未释放的锁增加有效时间。
  5.redis主从复制
  A客户端在Redis的master节点上拿到了锁,但是这个加锁的key还没有同步到slave节点,master故障,发生故障转移,一个slave节点升级为master节点,B客户端也可以获取同个key的锁,但客户端A也已经拿到锁了,这就导致多个客户端都拿到锁。
  使用RedLock
  首先生成多个Redis集群的Rlock,并将其构造成RedLock。如果循环加锁的过程中加锁失败,那么需要判断加锁失败的次数是否超出了最大值,这里的最大值是根据集群的个数,比如三个那么只允许失败一个,五个的话只允许失败两个,要保证多数成功。加锁的过程中需要判断是否加锁超时,有可能我们设置加锁只能用3ms,第一个集群加锁已经消耗了3ms了。那么也算加锁失败。2,3步里面加锁失败的话,那么就会进行解锁操作,解锁会对所有的集群在请求一次解锁。
  可以看见RedLock基本原理是利用多个Redis集群,用多数的集群加锁成功,减少Redis某个集群出故障,造成分布式锁出现问题的概率。ZooKeeper分布式锁
  1.多个客户端创建一个锁节点下的一个接一个的临时顺序节点
  2.如果自己是第一个临时顺序节点,那么这个客户端加锁成功;如果自己不是第一个节点,就对自己上一个节点加监听器
  3.当某个客户端监听到上一个节点释放锁,自己就排到前面去了,此时继续执行步骤2,相当于是一个排队机制。
  使用Curator框架进行加锁和释放锁
  来源:
  https://segmentfault.com/a/1190000038330434

大数据平台规划与数据价值挖掘应用咨询项目建设方案(73页PPT)声明因转载众多,无法找到真正来源,如标错来源,或对于文中所使用的图片文字链接中所包含的软件资料等,如有侵权,请跟我们联系删除,谢谢。将在收到信息后第一时间进行删除。参考资料来源网络迅风智能无接触式智能洗车,让洗车更加高效安全本网7月14日讯近年来持续不断的新冠疫情,让无接触经济迎来快速发展,也激发了市场的新活力,催生新业态。特别是城市服务体系中不可或缺的板块洗车行业,在政策市场和科技的多重推动下,无接嚯,老天爷,油价高得离谱,你还要罚我钱?路过加油站的时候,我闻了一下味儿,工作人员小跑出来,张嘴就要收我50。这我能答应?近期俄乌局势激化,推动油价持续上涨。目前92号汽油涨到了九块多了,95号汽油已经逼近十元大关,98明明老天爷赏饭吃,却偏偏作死动脸,这6位女星,既可惜又活该爱美之心,人皆有之。尤其在颜值就是饭碗的娱乐圈,明星为了美而去整容早就是行业内公开的秘密,连倪萍姐姐都在节目里直言现在哪个明星没整过容。同时她还表示,微调可以,但是在脸上大动干戈弄时隔16年,刘天仙又杀回来了老天爷赏的饭,该吃还是得吃国产古偶好久没这么风光过了。梦华录开播后直接播放量爆表,热搜屠榜。天仙刘亦菲搭配帅哥陈晓,直接在天下苦古偶丑久矣的古偶市场,一骑绝尘。网友心理活动男菩萨女菩萨拯救古偶这才是颜狗天堂这张能PUA所有人的天之骄女脸,怕不是老天爷倒饭吃吧最近有一个如何成为国际超模的挑战火了羊随手一刷,最常见的就是模仿Chanel,Dior,Prada这些奢侈品蓝血品牌。你还别说,拍出来的照片,黑白分明,轮廓清晰简单,辅以金属配饰,原来,老天爷要救一个人,会给出这几个暗示01hr曾仕强教授说过,我们最相信的就是上天,因为它最照顾那些心怀善意的人。在谈及上天之前,我们不妨想想,到底什么是上天呢?其实,并非是天空,而是这世间所有自然规律的代名词。在自然内饰质感超过奔驰和特斯拉?凯迪拉克发布Celestiq最新内饰预告图之前,凯迪拉克发布了Celestiq纯电动轿车的内饰细节,向我们展示了一款有史以来最豪华的凯迪拉克轿车。从内饰预告图来看,其豪华感和质感超过梅赛德斯和特斯拉电动汽车。因为其价格可能警惕!微信出现这两个界面,马上停手很多人经常会用到微信转账在用微信转账时如果你的手机出现这两个界面一定要提高警惕说明你当前支付存在巨大风险这15分钟,非常关键风险提醒一定要注意冷静下来别上当为了阻止诈骗行为对被害人我们到底需要怎样的Web3游戏链游的需求与展望(下)在上一篇文章中,我们简单了解了Web3游戏的短板以及前景,今天,让我们继续来看看,现在的Web3游戏还欠缺些什么,又有哪些令人期待的部分。03hr每个Web3游戏都该有央行行长我们真我realmeGT2大师探索版体验,新骁龙8配压感直屏,游戏手机?从三星开始引领曲面屏风潮开始,旗舰机都纷纷抛弃了直屏设计,换上了视觉上边框更小,所谓握持感更舒服的曲面。诚然曲面屏因为必须使用曲面玻璃和柔性屏,成本自然会肉眼可见的提高,但是经过这
准爸妈准备好迎接宝宝了吗快来看看你有没有漏掉什么超实用精简新生儿用品清单及购买攻略孕晚期小孕妇,新生儿用品购买攻略已做好!欢迎探讨。宝宝的东西实在太好看了!而且我超级喜欢蓝色,看到蓝色系的新生儿物品就挪不开眼镜,敲级清新和治愈。宝宝肠胀气的原因和预防(特别家教1129期)为了在特殊时期为家长提供特别的家庭教育指导,全国妇联推出了特殊时期特别家教微信栏目,家长可以通过家庭教育微课学习家庭教育知识。宝宝肠胀气的原因和预防(特别家教1129期)宝宝无故哭暖到心坎!探访重医儿童医院新生儿科母婴家庭病房新生儿科副主任韦红教授床旁查看和指导。邹乐摄早产宝宝丫丫依偎在妈妈怀里,紧贴着妈妈的皮肤趴着,甜甜地睡着了。这个本该还在妈妈肚子里的宝宝,仿佛又回到妈妈子宫里一般,既温暖又安全。这奋斗故事征文大赛我心遣我手丹青绘丹心(山东省)作者殷彩敏一世上没有绝对绝望的处境,只有对处境绝望的人。题记我是一个普通的农家女,也是一个行动不便的残疾人,但也是世界上最幸福的人之一,因为我生活在一个伟大的时代,生活在爱与尊重中快评丨日营收近6000万引争议,医院要直面信任危机重建信任的最好方式,就是直面不信任近日,有亚洲最大医院之称的郑州大学第一附属医院(下简称郑大一附院)在官网公布了其2021年度单位决算数据。报表显示,郑大一附院2021年收入合计2印媒中国开发出30000公里通讯技术,可操控无人机潜艇全球作战有消息称,我国已经成功开发出了一种可以在30000平方公里内,进行通信的技术,这种技术可以让无人机和潜艇,即便是距离很远依旧能够保持连接。据悉这次实验是在南海的某个地方进行的,研究俄美宇航员今将共乘飞船上太空,计划在国际空间站踢足球图为2018年,俄罗斯宇航员在国际空间站踢足球(新华社资料图)据塔斯社报道,俄罗斯联盟MS22号飞船将于21日飞往太空执行任务。俄罗斯宇航员谢尔盖普罗科皮耶夫在20日举行的新闻发布KTV音响的优劣如何评判?GAE音响G6音箱不同档次的KTV场所,使用品质的音箱也是有所不同的,毕竟市场还是一分钱一分货。高档的包房,音箱必须挑选音质干净听感层次分明明亮清晰细节丰富柔和而富有弹性的。如果音箱不够优秀,那音质即热多档,一步实现热水自由九阳太空热小净二代Pro体验多喝热水,可以说是刻在中国人DNA里的养生基因,已经成为中国人独有的生活习惯了。把水加热是最为简单有效的杀菌手段,早在建国初期喝热水就被大力推广。如今人们不仅热衷于喝热水,更喜欢用成品油零售限价下调今夜开启,一箱92号汽油将少花11。5元,0号柴油重回7元时代金融界9月21日消息今夜24时,成品油零售限价将开启年内第7次下调!据国家发改委今日消息,根据近期国际市场油价变化情况,按照现行成品油价格形成机制,汽柴油零售限价每吨分别下调290互联网原罪实体经济不好的罪魁祸首?为什么要把一切罪过归咎于互联网平台?某大V发了一个预测,未来几年所有互联网平台都会有一个消费限额,达到限额后无论是个人还是平台都要限制互联网消费!这不是某大V一家之言,而是呼应了很网约车聚合平台如何健康发展?高德打车以规范强效助力随着社会经济的不断发展,越来越多的人在出行时都倾向于选择更加快捷方便的出行方式,除了自驾公共交通共享出行等方式之外,网约车近年来也成为出行板块的中坚力量。根据网约车监管信息交互平台VM概述内存结构溢出调优什么是JVM?定义JavaVirtualMachinejava程序的运行环境(java二进制字节码的运行环境)好处一次编写,到处运行自动内存管理,垃圾回收功能数组下标越界检查多态j腾讯入股鱼跃医疗子公司,看上国产的救命神器AED记者陈杨编辑谢欣9月19日,鱼跃医疗发布公告称,其全资子公司讯捷医疗拟以增资扩股的方式,引进战略投资者腾讯。腾讯将以现金出资2。91亿元认购前者的新增注册资本。增资后,鱼跃医疗腾讯锂电池行业产业链拆解(深度)负极,隔膜,电解液锂电池由锂金属或锂合金为正级或负极材料使用非水电解质溶液的电池。锂电池的充电放电过程主要依靠锂离子(Li)在正极和负极之间移动,充电时,锂离子从正极脱嵌,经过电解质嵌入负极,负极处与宋丹丹深度绑定的这家豆瓣酱,年销7亿,要上市了文丨快消闷声发财排队上市,以郫县豆瓣为代表的复合调味料企业正迎来高光时刻。又一个小而美近日,四川丹丹郫县豆瓣集团股份有限公司(下称丹丹豆瓣)进行首次公开发行股票上市辅导备案。根据备美元持续加息,人民币顶得住吗美国当地时间9月21日,美联储宣布再次加息75个基点,将基准利率升至3。003。25区间,利率水平升至2008年以来新高。今年至今,美联储已连续5次加息,并且这是美联储今年连续第三人民币跌破7。05!中国资产被抛售?不顾美元加息,人民币在升值本文为财说得明白原创,各平台同步发布,谢绝转载。01,跌破7。05明天凌晨,美联储将会公布这一次议息会议的最终加息幅度,随着加息的步伐越来越近,美元指数已经稳步停留在110以上。而人民币与美元的较量(一)概况最近人民币对美元汇率破7,从3月的6。3到5月的6。8,9月正式破7。美元在这一轮表现非常强劲。汇率是由什么决定的?(1)短期来看,汇率是由购买力决定的。美国目前加息意味链上身份和数字人民币是打开Web3落地中国的钥匙从2017年开始,国内在区块链的技术发展联盟链的建立和应用实践探索等方面已经实现了初步发展,证明了国内发展Web3的技术实力和进步意愿。我们已经拥有了诸多BaaS解决方案和联盟链服中国人民银行与两国央行签署合作备忘录建立人民币清算安排中国银行保险报从中国人民银行获悉,近日,人民银行与哈萨克斯坦国家银行老挝银行分别签署建立人民币清算安排的合作备忘录。人民银行表示,上述安排将有利于中国与哈萨克斯坦中国与老挝企业和金危机升级!今晚美联储再度大幅加息!美国或再度收割?如何应对?就在今晚上,美联储即将大幅加息!这次是加息75个基点还是100个基点?中国又该如何应对呢?从加息的概率上来看,目前华尔街给出加息75个基点84的概率,加息100个基点的概率为16,