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

终于懂什么是分布式锁

  为什么要有分布式锁?
  模拟一个秒杀接口:
  商品表:
  单机情况下,用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

自作自受?美国陷入尴尬境地,美墨边境墙建不建都费钱美墨边境墙是特朗普的政治遗产之一,给现任美国拜登政府带来了很大的麻烦。在2016年的美国总统大选中,特朗普给出了修建美墨边境墙的承诺,以防止来自墨西哥的非法移民越境。特朗普任期内4三条消息与中美有关,美副国务卿将访华,白宫扩大化打压中企投资拜登上台以来,中美关系并没有出现明显的好转。甚至于,拜登将中国定义为美国的战略竞争对手。尽管如此,还有一部分人对美国心存幻想,认为只要我们按照所谓的国际规则办事,就能够与美国化干戈桃花姬放在口袋里的健康零食桃花姬是针对都市白领推出的健康零食,采用上等东阿阿胶等各种优良原料制作而成,桃花姬的宣传语是吃出来的美丽。近年来,国风大兴,东阿阿胶推出的国潮新品桃花姬,因其精美的包装和丰富的营养JEETONE和漫步者lollipods蓝牙耳机哪个好?上手体验评价作为数码发烧友,平时最爱的就是在各种耳机论坛逛逛,对耳机蓝牙耳机都了如指掌。看到不少网友在讨论JEETONE和漫步者lollipods蓝牙耳机哪个好,我入手这两款蓝牙耳机已经有一个近半国防开支流入军火商!美国如何被军工复合体绑架?最近一份题为战争的利润911事件后美国五角大楼开支激增的企业受益者的研究报告引发了大家的关注,这份来自美国布朗大学的报告显示,自2001年美国发动全球反恐战争以来,美军在阿富汗和伊台下的奥运健儿都吃啥?这个国产品牌火到了东京截止目前,中国以32金,23银,16铜,总计71块奖牌成为奥运奖牌榜的第一名。虽然说东京奥运会来得稍微迟了一些,但这并不妨碍运动员们的精彩表现,举重,游泳,乒乓球等比赛项目都展现了美国与澳大利亚遭遇法国外交警告!为何法国敢和五眼联盟撕破脸?最近法国对美国和澳大利亚进行了外交警告,召回了驻美大使和驻澳大使,那么是美国和澳大利亚做了什么刺激了法国了吗?没错,法国人真就被澳大利亚和美国耍了,丢了面子,也丢了钱,这让骄傲的法双11被外媒热议,美国超市没货卖,天猫京东唯品会却卖嗨了?近段时间,美国供应链几度失控,以往10美元的牛排现在售价20美元,整整翻了一倍,2。4美元一磅的培根,现在涨到6美元。美国哥伦比亚广播公司的记者惊呼,突然买不到自己想买的东西了,图春季如何做好护肤,这里告诉你春季代表着万物复苏,生机勃勃。但春季也是各种肌肤问题频发的季节,尤其是换季时期,气温时冷时热,肌肤状态随机不稳,让人苦不堪言。那今天就分享一下在春季怎么做好护肤吧1不要过度清洁皮肤美军自杀人数暴涨却扯上中国,拜登神预测,网络攻击引发大国战争一直以来,美国军队战斗力都很强。二战以后,美军士兵在全世界横行。但美军强大的战斗力主要得益于先进的武器装备,而不是美军士兵的战斗意志。2020年,仅仅是公开的数据,就有385名美军拜登自诩为自由世界领袖,美媒泼冷水称联俄抗中不可行2021年6月16日,拜登以个人身份与俄罗斯总统普京在瑞士首都进行了一场长达四个半小时的会晤。根据媒体的报道,这场会晤的内容涉及了战略核稳定外交争端地区冲突网络安全贸易人权以及北极
工信部下架APP是什么意思。会有什么后果?谢邀!我们在上网的时候,经常会看到工信部下架了某些APP的新闻,一些比较知名的APP比如天涯脉脉途牛等都曾经被工信部下架。很多网友好奇这是什么意思,以及APP如果被工信部下架会有什监测尘量黑科技,追觅无线吸尘器T30带来不一样的清洁体验写在前面吸尘器是大家非常熟悉的小家电,它也一直是笔者清扫整屋灰尘的主要工具,不过笔者目前使用的这款吸尘器存在着吸力小续航短配套刷头少等问题。追觅科技作为中国清洁领域的代表科技品牌之工信部副部长刘烈宏今日起新进网5G终端默认开启SA模式5月17日消息,在世界电信和信息社会日大会,工业和信息化部副部长刘烈宏表示,5月17日起,新进网5G终端将默认开启5G独立组网(SA)功能,加快基于5G的新型消费终端成熟。刘烈宏表苹果产品系统全面升级IOS15要来了最近苹果的降频门事件备受关注,苹果也是光速做出反映,最短的事件里更新了新的版本,14。6版彻底解决了11以及12升级后变卡的现象。最近又有消息指出,苹果公司将会在6月7日到11日举和苹果手表功能相近,外观相近却不是苹果手表,魅族手表它来了在Flyme9发布的时候,就透漏了关于魅族手表的消息,发布会上没有重点强调这款产品,只是说5月份会发布,伴随着5月即将过半,魅族又将重新定义五月,谁知道这时候魅族好队友电信eSIM偷偷模仿微信支付宝?日本移动支付上线仅4天,结果钱没了我们都知道,微信支付宝都是非常重视支付安全的,所以一直都没有出过大问题,得到了很多消费者的肯定,也成为了一些海外国家争先模仿的对象。日本的这款名为7pay的移动支付APP,也似乎在高端工业机器人不再受制于日本科技深一度高端工业机器人不再受制于日本洞见计划工业机器人的RV减速器,对制造业来说,相当于手机电脑的芯片,其核心技术和全球90的市场一直被日本垄断。当前国产机器人使用的RV减速器大鸿蒙系统更新使用之感受鸿蒙系统这几天一直是最热门的话题,更新差不多一个礼拜了,再谈一下这几天的使用感受,不喜勿喷啊祈祷祈祷祈祷首先呢纠正一个错误,前几天所说的个别app自动更新以后不能安装使用问题现在已全国17个城市滴滴司机免费领取好礼,平台感恩司机辛苦付出这几天,相信大家都被五一火爆的旅游数据刷屏了全国国内旅游出游2。3亿人次,再创历史新高。庞大的出游人群,也对各个城市的交通接待能力带去了巨大考验。因此,在今年五一小长假中,许多滴滴Chia硬盘矿第二大矿池突然跑路关闭提现通道最近Chia硬盘矿很火爆,不少人都投巨资升级硬盘挖矿,期待Chia能成为下一个比特币。但别忘了风险,日前第二大矿池UU跑路了,2万矿工惨了。币圈的平台矿池关键时刻拔网线不是传说,通美的也要造车?官宣5月18日发布新能源汽车新品点击右上角加关注,全国产经信息不错过TechWeb5月17日消息,据美的集团官方微信公众号消息,美的新能源汽车新品将于5月18日发布。据网上传出的消息,美的即将发布的新能源汽车新品