粉丝530获赞7757

教大家怎么恢复笔记本自带的原装系统 啊?看操作步骤啊,打开控制面板,设置里面的这个往下安全 恢复。点这个开始删保留文件的话,他可以保留这个应用文件跟这个保存文件,删除所有内容 啊,点下一步好点重置, 从至到百分之百就可以了,看这个系统的话就恢复环。

今天给大家分享一下主 keeper 啊,实现分布式锁,当然了,这里并不是说纯纯的一个八股文的分享,而是说我们在 spring pro 的项目中啊,如何去进行一个啊,分布式锁的一个书写和应用啊,然后 这是我们的一个工程啊,项目工程的一个目录架构啊,然后相关的一个代码以及说文档或者说配置啊,都会在视频的最后啊告诉大家如何去获取。好,那这里进入到我们的分享我们这里呢,以三台的足配配集群啊为例,然后是演示一下这个超卖场景的一个呃,分布式锁的一个应用啊, 好啊,然后如果说啊有小伙伴想去部署一下这个 j k 集群啊,我这边是通过这个道合横铺子啊,然后整个的一个配置文件也放在了这个道合的木头之下,有感兴趣的小伙伴可以自己去部署一下。好,然后我们来说一下我们的一个集成啊,集成 的话,这边其实我们去通过这个凯塔这个包啊,他给我们提供了一些 jk 的一些封装啊,相对来讲就相当于我们有轮子可以用啊,然后下面的这一些呢,都是很普通的数据库的一个包啊, ok, 然后说使用的话,我们必须啊,按照他的规则,我们要在这个 supreme 当中去注入一个 艾克特的一个分化卡,然后其实这里就是给他创建一个连接嘛,就是连接的相关的配置,然后在这边去啊,给他注意进来,然后这边写了一个 party 啊,然后这其实就是我们自己去把我们的一个 jk 集群的一个地址啊,你然后把它放进来,如果说你自己要跑的话呢,记得把这块改一下。 好的,然后我们来看一下锁的一个使用啊,如果说我们基于这个啊 creator 它来实现一个分布式锁,其实很简单啊,我们这边其实只有两个方法,一个是说 lock 和一个 unlock, 课的时候呢,其实啊,主要是说他提供了一个可承诺锁的这样的一个对象啊,然后我们只需要创建这个对象之后呢,进行一个 acquire 方法啊,谁 acquire 了,谁就锁住了,谁就可以继续执行业务逻辑。 而执行锁解锁的时候呢,只要调一下这个 release 就可以了,而我们实际啊应用呢,就是这个样子啊,我们在进行减库存操作的时候呢,我们先创建一把锁,然后呢,你拿到锁了,你就可以继续执行下面的代码,执行完了之后呢,进行一个解锁操作啊,大概是这个样子的 啊,当然这里的话其实也看不出来什么太多的东西,我这里呢也自己去写了一个呃,做 kpo 的一个锁,然后这里呢,我们要对照着一张图来看一下这个 jk 锁到底是怎么回事。 这里呢,假如说我们有好几个后端,我们我们去加锁,对吧?啊,加锁的时候呢,我们都会去锁这个 log 这个节点,其实呢,整个过程就说我们会在这个 和节点之下不停的去创建这个子节点啊,零零一,零零二零零三啊,对应的就是啊,县城 apc 啊。然后呢,这时候其实谁排在第一个谁就先执行啊,大概是这样的一个操作,那排在第二个的呢,你没有执行,你就在等待,你要去监听前面你前面的一个节点,如果说他执行完了就到你了, 就以这样的方式去实现了一个公屏锁的一个效果。好,然后我们来看代码,这里的代码呢,大概也是分为啊三部分,一部分是说我们的勾到函数里面会去创建一个 jk 的一个对象,对吧?好, 这里呢,其实我们会去判断一下 lock 节点有没有啊?没有的话去创建,那有的话就相当于是我们的一个啊锁的一个实力就已经创建完成了。然后接下来呢是说进行一个呃 lock lock 的时候呢,其实我们就会去创建这样的一个节点啊,在 lock 的呃 节点之下,然后去创建了一个带序号啊,这个序号其实是通过我们的这个工具类啊,这可以提供的,然后生成一个序号,然后我们就会去创建这样一个节点,其实创建的就是这个东西,对吧?然后创建完成了之后呢,我们会拿到这个 lock 节点之下的所有的指节点啊,就拿到了这个一二三, 哎,拿到了之后呢,我们会去判断一下,如果说这个只有一个啊,直接点只有一个,那就是你刚才创建的,对吧?就是你相当于说你拿到锁了,然后你就直接去吞了,就是你可以继续去执行你的业务操作了,那如果说 不是一,那这时候我们要对这个节点进行一个排序,对吧?然后呢我们其实会拿到你当前的这个节点,然后我们看一下你这个节点在这个排序中的一个位置啊,如果说没有找到,那肯定是出问题了,如果说是零,证明你在第一个,对吧?那就是找到了,找到了的话你就执行啊业务操作就可以了,因为你在第一个,对吗?那如果说你也 不在第一个,那这个时候呢,其实我们就需要去创建一个监听,而监听的路径呢,其实就是在你前面的那个节点哈,在这里,然后呢去进行一个监听,监听了之后呢,我们会进行一个 avit 哈,然后这里呢其实是通过这个哈达烂场来实现的一个等待操作。 呃,那我们什么时候会啊,这个会被释放掉这个威特呢?然后我们可以看一下我们的一个监听啊,监听其实是在我们连接创建的时候就已经啊在监听这个路径了, 然后当今天听到的时候呢,我们这个哈达烂齿他会进行一个简易的操作啊,简易过后呢,其实我们这个俄维特就会被唤醒,然后我们就会进入到 retin 这一行,对吧?这时候相当于是说你已经拿到了锁啊,赶紧去执行这个业务操作了。 那我们再来看一下这个释放锁的一个过程啊,解锁的一个过程其实就是直接删除就可以了。然后 我们来看一下整个的一个应用啊,应用的话在这边跟刚才的那个也很相似啊,我们首先去另一个锁,对吧?用完了之后呢,我们去进行一个 lock, lock 完了进行一个 lock 啊,中间是你的业务操作, 也是非常的啊,实用起来很简单。好,呃,那接下来我们来测试一下我们的 锁锁了一个效果啊,首先说这边我写了 control 了,对吧?嗯,有两个啊,就是对我们这两种锁的实现都去进行一个测试啊,这里我们就看这个啊, correct 的一个测试吧。 然后呢这边啊,据说这个业务代码,这是枷锁,这是业务代码,我们会去查一下有多少的一个库存啊,如果说他大于零呢,我们会去进行一个库存的减,这个库存的减操作呢,其实就是一个 update 啊,简易的一个操作。然后呢如果说库存不足,那我们直接抛出异常啊,最终去进行一个解锁啊。 呃,首先我们先来演示一下无锁啊,如果没有锁的话会是什么样子的啊?这里我们注视一下代码,然后我们需要启动一下我们的这个布置项目,然后这里呢我的一个测试啊,其实是基于这个本地啊,启动两个副本, 以及说结合我们的 antix 和 jimeter 进行一个压测。那这块有不懂的小伙伴呢,可以去看一下我之前的视频啊,有分享过,然后这里我就直接启动了。 好,这里呢其实我们是在八零八零端口和我们的八零八九端口之下,分别去跑了一个副本,然后我们通过这个 ndx, 然后去做了一个负载均衡,然后呢我们利用这个 cmatter, 然后去进行一个压测啊,然后我们这边的话是以两百个的一个并发数量去进行压测,压我们的这个四个八的端口啊,四个八的端口就是我们这个 n j x 监听的一个端口,然后 后去进行一个减库存的操作,然后这里呢我们可以看一下我们数据库当中这一条数据,这时候其实我们就只有二十个库存,然后我们来稍微压一下看看效果, 其实这里我们直接能看到大部分都是成功的,就只有啊这么一个是抛异常的啊,肯定是说出问题了。嗯,然后呢我们可以看一下日志啊,这边其实也抛出来了几个异常,说是库存不足,对吧?然后我们来看一下我们的数据库, 好,这时候其实你看到这种库存已经出现了负数,对吧?其实已经超卖了,就说明没有锁的情况之下,是会发生超卖问题的,对吧?然后我们来重置一下我们的数据, 好,然后我们再恢复一下我们的这个 j k 锁,然后我们再启动一下项目, ok, 这边我们都启动完成了,然后我们再用这个 j matter p 压一下有锁的情况下,看看会不会超慢。好了,这里已经执行完成了,其实这边我们可以看到啊,后面的就全是异常了,对吧?然后我们来看一下,不管是我们的这个八零八零端口,还是八零八九端口的一个控制台,都输出了非常多的一个库存不足。 然后这里呢我们来看一下我们最终的一个数据库的数据,你发现库存是零,也就说他没有发生超卖的一种情况,换句话说这个 jk 锁是好使的,对吧?那我们今天的一个分享就到这里就结束了,然后有需要这个啊代码的一个小伙伴呢,我们可以到这边来啊, 到这边来找一下这个散装加码,然后你给他回复一个文档啊,你就可以拿到了对应的整个的一个代码仓库,以及说项目的一个文档,然后我这个代码仓库里面的每一个模块,就是一个单独的视频库的项目, 都非常的纯净,只演示了这个目标的一个功能。然后你找到这个 lock 和 z k 啊,就可以看到这个分布式锁, j k 分布式锁相关的一个代码。好,那我们今天的分享就到这里,下期再见。