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

分布式锁及其常见实现方式

  1. 什么是分布式锁?
  在分布式系统中,为了保证对数据的修改有最终一致性,通常使用分布式锁或者分布式事务。比如常见的多个系统同时修改商品,既依赖于现有数据也要修改数据,如果没有限制,高并发情况下很可能最终数据是错误的。
  与单机锁不同,分布式锁更加复杂,需要考虑网络延迟、服务阻塞等,通常具有如下特点:同一时间只能有一个线程拥有锁;高可用,获取和释放锁必须可靠;高性能,获取和释放锁必须快速完成;可重入,已获取锁的线程可以再次获取锁而不会发生死锁;过期失效,避免死锁;阻塞(根据业务需要)。2. 基于数据库实现分布式锁2.1 基于表主键唯一实现分布式锁
  利用数据库主键唯一的特性,可以基于唯一主键保证多次操作只有一次成功。在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。释放锁时,直接删除数据库记录即可。
  此方案存在的问题是强依赖数据库,容易形成热点,数据库锁表导致的超时会影响性能,或者数据库宕机会导致服务不可用。并且,数据库本身没有失效机制,如果任务崩溃会导致数据库中的锁不能被释放。数据库插入操作本身没有阻塞机制,故无法实现分布式锁的阻塞等待,任务线程可能需要重复尝试插入。由于唯一主键的存在,持有锁的线程也无法重复获得锁,其他线程竞争锁的过程中也无法根据优先级进行分配。2.2 基于表字段版本号做分布式锁
  在数据库中为表增加一个版本号字段,每次操作时判断版本号,只有版本号一致才能进行对应的修改,修改后版本号加 1,通过 CAS 的方式进行修改。
  此实现会增加数据库操作的次数,高并发情况下可能性能不好。2.3 基于数据库排他锁做分布式锁
  for update是一种行级锁,又叫排它锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行。我们可以认为获得排他锁的线程即获得分布式锁,任务执行完成后通过 commit 来释放锁。for update 语句会在执行成功后立即返回,在执行失败时一直处于阻塞状态,直到成功。
  注意: InnoDB 引擎在加锁的时候,只有通过索引进行检索的时候才会使用行级锁,否则会使用表级锁。这里我们希望使用行级锁,就要给要执行的方法字段名添加索引,值得注意的是,这个索引一定要创建成唯一索引,否则会出现多个重载方法之间无法同时被访问的问题。重载方法的话建议把参数类型也加上。
  但是 MySQL 会对查询进行优化,即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同执行计划的代价来决定的,如果 MySQL 认为全表扫效率更高,比如对一些很小的表,它就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。3. 基于 Redis 实现分布式锁3.1 setnx()、expire() 方法实现分布式锁
  setnx 的含义就是 SET if Not Exists,主要有两个参数 setnx(key, value)。该方法是原子的,如果 key 不存在,则设置当前 key 成功,返回 1;如果当前 key 已经存在,则设置当前 key 失败,返回 0。setnx 命令不能设置 key 的超时时间,只能通过 expire() 来设置。
  锁的实现步骤:调用 setnx(lockkey, 1) 获取锁。如果返回 1,则获取锁成功。调用 expire() 命令对 lockkey 设置超时时间。执行完业务代码后,通过 delete 命令删除 lockkey。
  这个方案如果在第一步 setnx 执行成功后,在 expire() 命令执行成功前,发生了宕机的现象,那么就依然会出现死锁的问题。3.2 setnx()、get()、getset()方法实现分布式锁
  这个方案是对上一个方案的优化版本。
  getset() 命令主要有两个参数 getset(key,newValue)。该方法是原子的,对 key 设置 newValue 这个值,并且返回 key 原来的旧值。假设 key 原来是不存在的,那么首次执行的返回值是 null。
  锁的实现步骤:调用 setnx(lockkey, 当前时间+过期超时时间) 获取锁。如果返回 1,则获取锁成功。如果返回 0,则获取锁失败,进一步调用 get 方法判断。get(lockkey) 获取上次设置的过期时间 oldExpireTime 。如果 oldExpireTime 小于当前系统时间,则认为这个锁已经超时,进一步调用 getset 方法判断。getset(lockkey, newExpireTime 当前时间+过期超时时间) 设置新的过期时间 newExpireTime,并返回之前的值 currentExpireTime。如果 currentExpireTime 与 oldExpireTime 相等,则获取锁成功,不相等则说明锁被其他请求抢走了。执行完业务代码后,要判断下锁有没有超时,如果没有超时通过 delete 命令删除 lockkey,如果超时了则不处理(可能已被抢走)。
  这个方案在任务处理超时或发生宕机时,无需担心锁超时问题,下次请求可以判断出实际上锁已经超时了。4. 基于 ZooKeeper 实现分布式锁
  zookeeper 由多个节点构成(单数),采用 zab 一致性协议。因此可以将 zk 看成一个单点结构,对其修改数据其内部自动将所有节点数据进行修改而后才提供查询服务。
  zookeeper 数据是目录树的形式,每个目录称为 znode, znode 中可存储数据(一般不超过 1M),还可以在其中增加子节点。
  子节点有三种类型。序列化节点,每在该节点下增加一个节点自动给该节点的名称上自增。临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除。普通节点。
  zookeeper 提供了 Watch 机制,client 可以监控每个节点的变化,当产生变化会给 client 产生一个事件。
  可以利用临时节点与 watch 机制实现分布式锁。每个锁占用一个普通节点 /lock,当需要获取锁时在 /lock 目录下创建一个临时节点,创建成功则表示获取锁成功,失败则 watch/lock 节点,有删除操作后再去争锁。临时节点好处在于当进程挂掉后锁的节点自动删除不会发生死锁。
  缺点在于所有取锁失败的进程都监听父节点,很容易发生羊群效应,即当释放锁后所有等待进程一起来创建节点,并发量很大。
  一个可行的优化方案是上锁改为创建临时有序节点,每个上锁的节点均能创建节点成功,只是其序号不同。只有序号最小的可以拥有锁,如果这个节点序号不是最小的则 watch 序号比本身小的前一个节点 (公平锁)。watch 事件到来后,再次判断是否序号最小。取锁成功则执行代码,最后释放锁(删除该节点)。
  性能上可能没有缓存服务那么高,因为每次在创建锁和释放锁的过程中,都要动态创建、销毁临时节点来实现锁功能。zookeeper 中创建和删除节点只能通过 Leader 服务器来执行,然后将数据同步到所有的 Follower 机器上。5. 总结
  分布式锁比较复杂,也比较容易发生死锁。目前主流的实现方式包括:基于数据库实现分布式锁。基于 Redis 实现分布式锁。基于 ZooKeeper 实现分布式锁。
  分布式锁及其常见实现方式 - 程序之心

支付宝推出黑科技识海鲜服务,海鲜小白也能玩转海鲜市场如果你想快速地了解一个城市,那就去看看这个城市的菜市场吧!这句话如果对应三亚的话,那一定是当地丰富的海鲜市场啦!这其中最有人气的还要数火车头万人海鲜广场第一农贸市场春园海鲜广场和小助力茶叶市场,振兴乡村经济德邦快递为勐海茶业输入新鲜活力早春三月,中国普洱茶圣地云南西双版纳勐海县迎来了采摘季。当地茶园面积超过87万亩,新鲜的茶叶经过茶农们采摘加工和发酵后被制成普洱茶销往全国。茶叶运输业务也迎来了旺季。近日,德邦快递Android,iOS,H5,阿里小程序可运行,跨平台技术条件判断什么是条件判断是指某一个元素,或者说某一块元素,是否要渲染。我们可以来看一个例子,看看uniapp当中条件判断跟其他平台的条件判断是否一样。uniapp当中要做条件判断用到一个指令买车面子很重要吗?为什么身边都推荐买BBA?想想挺有意思买车面子重要吗?问过身边朋友,有的说重要,有的说不重要。说重要的理由是能给车主带来正向收益和加成,说不重要的理由是买车选合适的就行,不要花了自己钱买别人喜欢的车。在这个问题上,小木既要动力又要便宜,推荐5款国产2。0T发动机,买车选它,不会后悔说到2。0T发动机,国外有很多经典款,比如宝马B48奔驰M274本田地球梦2。0T丰田8ARFTS大众EA888Gen。3B等等,这些老牌车企在内燃机技术方面的研究要领先我们很多。20万预算,中大型SUV,动力和空间兼备,这3款车型不得不看说到中大型SUV,大家脑海里第一印象是哪款车?奥迪Q7?大众途昂?福特探险者?貌似20万的预算连最低配都够不着。那是不是20万预算就没有选择呢?也不是,随着自主品牌不断地进步,一些13万预算,7款合资轿车,有安全有动力还有颜值,怎么选?前面节目中小木有推荐过13万预算值得入手的SUV,今天来说说值得入手的合资轿车有哪几款?几款里面应该怎么选?我们逐一说说。预算内小木给大家列举了7款车型,分别是马自达3昂克赛拉日产开几万元的车会让你觉得没面子吗?网友热议请给我一记耳光作为世界第一大汽车消费市场,我国形成了独具特色的汽车消费现象和汽车消费心理。久而久之,很多朋友都存在好面子攀比虚荣的心理,把汽车视为身份和财富的象征。这多少与文化信仰观念贫富差距等620元华硕ITX小钢炮!INTEL9代主板反上7代处理器前言就先来一个科普,大家都知道INTEL6代7代的主板,上8代9代的处理器,叫做魔改。那么8代9代的主板,上6代7代的处理器,叫做啥子呢?反向魔改?另外,华硕华擎的主板,在设计上相远程视频不掉线高效协同很轻松!硬核团队奖就奖华为办公宝2020年中国在科研方面发生了很多大事,震惊了世界。比如中国载人潜水器奋斗者号,在西太平洋马里亚纳海沟成功下潜突破1万米,达到10909米,创造了中国载人深潜的新纪录。能入地也能上沃尔沃XC60别说ampampquot躺平人ampampquot,连小孩都能轻松完成驾控操作最近,躺平这个词在网上又大火了一把。虽然说,对于年轻人的消极态度,我们还是要以激励为主,但是对于人们在沉重的压力下想要轻松一点的诉求也要持理解的态度。而沃尔沃便通过最新的一系列操作
华为Mate40即将登场,Mate30Pro新低,降600元由于美国的制裁,华为的麒麟芯片即将成为一首天鹅歌,这使得华为即将面世的年度旗舰产品华为Mate40系列引起了人们的关注。不久前,华为消费者业务首席执行官于承东公开表示,华为的MatF17Pro即将海外发布,网友可能是最时尚的F系列手机众所周知,自从进入2020年后,5G手机便迅速普及,这对于我们来说,当然是一件好事情,毕竟可以享受到5G带来的高速网络体验。但相信有接触过5G手机的朋友,都会明显感受到其与4G手机七夕函厂来袭!婚礼请柬定制服务已开启,网友新业务上线?今天是农历七月初七,是中国的传统节日七夕节,又名乞巧节。这个节日一直是中国人重要的传统佳节,有很多传统习俗,也有很多浪漫传说。在这个浪漫的日子,魅族推出了七夕特别活动8月25日当天准大学生新装备都选TA?这些体验太酸爽,谁用谁知道9月开学季,相信很多准大学生在正式踏入大学校园之前,都会给自己更换一些新装备,而手机无疑是同学们最想更换的新装备之一。如果屏幕前的你正在纠结换什么手机好,那么接下来要给大家推荐的这华为成功突破,又一项新专利公布,手机行业或许将要ampampquot变天ampampquot众所周知,没有真正意义上的全屏手机。尽管弹出式摄像机可以全屏显示,但也有许多缺点。机械笨重,手机不防水,结构复杂且价格昂贵,所有制造商都放弃了这种设计,取而代之的是使用药丸屏幕,刘跌至2800元,麒麟990256G,前置镜头DXO排名第一华为的nova系列现已发展到华为nova7,但给消费者留下深刻印象的是nova65G。现在由于华为nova7的上市,华为nova6不得不调整价格。在第三方平台上,华为nova65G被忽视的影音大厂!OPPO音乐素养很高,怪不得这品类卖这么好不久前,OPPO声学联合网易云音乐推出了一款OPPOEncoW31网易云音乐定制款耳机,凭借着精致小巧的设计以及出色完善的功能体验,该耳机一经上线就得到了广大消费者的青睐。甚至还得iQOO3狙击小米10失败,这次iQOO5能成功吗?目前,下半年的旗舰之战即将开始。当然,小米是首当其冲的。现在距离小米10Pro尊享纪念版的发布时间也不多了,配置什么的现在已经完全被曝光了,发布会的悬念只剩下价格,以小米为竞争对手高性价比配置不差,这款手机亮点均能满足每个时期都会有一些非常激动人心的手机,这些手机通常都配备了比较先进的,而且价格也比较合理,所以人们都喜欢购买这样的手机,毕竟谁不愿意买一个物美价廉的产品呢?如果你也希望,那么今天跟OPPO西欧最大旗舰店开业,网友一亿小目标稳了近日,OPPO在德国汉堡市开设了一家旗舰店,该店铺位于汉堡明克贝格街,是汉萨同盟城市中最受欢迎的海滨长廊之一。汉堡旗舰店也是OPPO在西欧开设的最大的销售门店。(OPPO在汉堡的旗国产品牌的高端之路除了华为,这家也很成功我们都知道,随着智能手机的高速发展,如今的手机市场已经被划分为了低中高三个档位,而国产手机凭借着亲民的价格和出色的硬件配置,一直占据着中低端市盘踞,高端市场则一直被三星苹果等大厂所