当前位置: 首页 > news >正文

做外贸生意上国外网站网络热词2023流行语及解释

做外贸生意上国外网站,网络热词2023流行语及解释,Wordpress分享到微信图标,做网站怎么添加背景图片一、为什么要使用分布式锁 1.抢劵场景 (1)代码及流程图 (2)抢劵执行的正常流程 就是正好线程1执行完整个操作,线程2再执行。 (3)抢劵执行的非正常流程 因为线程是交替进行的,所以有…

一、为什么要使用分布式锁

1.抢劵场景

(1)代码及流程图

(2)抢劵执行的正常流程

        就是正好线程1执行完整个操作,线程2再执行。

                              

(3)抢劵执行的非正常流程

        因为线程是交替进行的,所以有可能线程1查询后,线程2再查询。假如现在只有一张票,所以线程1会买到这张票,并扣除库存,现在也就是没有票了。但是线程2查询的时候,库存是有一张票的,所以也会进行库存扣除,变成-1张了。这样就出现了超卖的问题了。

                               

(4)那怎么解决(3)的问题呢

        1. 首先想到的就是普通的加锁,如下图所示:

       

        2. 这样会不会出现问题呢?当然有可能,在实际项目中,服务器大部分都是集群部署的,因为普通加锁只能解决单个服务器的互斥,不能解决多个服务器线程的互斥,所以还是有问题。

        

        3. 那应该怎么解决呢?就是我们提及到的使用分布式锁,这样就可以限制其他服务器也获取锁的问题,只有当一台服务器解锁,其他服务器才能拿到锁。

二、redis分布式锁

1.核心命令

        Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则 SET)的简写。

2.如何使用

        1. 命令设置,为什么获取锁要把超时时间一起写上去呢?还有为什么一定要设置过期时间呢?第一,不分开写就是要保证数据的原子性第二,不设置过期时间可能会导致死锁。可以看执行流程图,如果服务器宕机,会导致锁不能释放,造成死锁,所以要加过期时间兜底。

        2. 执行流程:

3.如何控制锁的有效时长呢

        1.根据业务执行时间预估。这种方法往往不能保证原子性,一般不使用。

        2.给锁续期。就是根据执行业务的时长进行锁时长的增加。那自己还需要开一个线程专门来监控,实现起来也比较麻烦,所以会使用redission实现的分布式锁

三、redission实现的分布式锁

1.redission实现分布式锁的流程

(1)流程图

(2)解释流程图的步骤

        首先,线程1获取锁成功后,采用 watch-dog来检查和更新锁状态,每隔(过期时间/3)的时间续期一次,然后操作redis,手动释放锁后,会通知watch-dog不用监听锁了。

        如果线程2也需要加锁,但是没有获取到锁,则会while循环去尝试获取锁,循环的次数也不是无限的,而是到达一定阈值就停止。也不用担心因为循环而导致获取锁失败,因为在高并发的情况下,业务时长不会太长,所以会在这种情况下可以增加分布式锁的使用性能。这也是分布式锁的一个特性:等待机制

(3)具体代码

public void redisLock() throws InterruptedException{//获取重入锁,执行锁的名字(自定义)RLock lock = redissionClient.getLock("nameLock");try {//尝试获取锁,参数分别是:锁的最大等待时间,锁自动释放时间,时间单位boolean isLock = lock.tryLock(10,30,TimeUnit.SECONDS);//判断是否获取锁成功if(isLock){//业务代码}}finally {//释放锁lock.unlock();}}

关键点:加锁、设置过期时间等操作都是基于lua脚本完成的,目的是保证数据的原子性

2.redission分布式锁的可重入

(1)例子代码

public void add1() {RLock lock = redissonClient.getLock("nameLock");boolean isLock = lock.tryLock();//执行业务add2();// 释放锁lock.unlock();}public void add2() {RLock lock = redissonClient.getLock("nameLock");boolean isLock = lock.tryLock();//执行业务// 释放锁lock.unlock();}

(2)如何实现呢

        利用hash结构记录线程id重入次数。其中key就是锁的名字,field就是线程的唯一标识,value就是重入的次数。根据上面代码,add1方法先获取锁后,value的值就是1。然后调用add2方法,add2方法也获取该锁,所以value的值就变成2。然后add2解锁,value就减一变成1。回到add1方法中,释放锁,value再减一,最后value就变成了0。最后当value为0时,就可以删除锁。

        关键点:必须是在同一个线程才能重入。

3.redission分布式锁的主从一致性

(1)非正常情况

        1. 当主节点宕机。

        2. 其中一个从节点会代替主节点。

        3. 如果这时线程2也来获取锁,因为线程1获取锁后,主节点宕机了,所以线程2会访问新的主节点,获取锁成功。这样会出现,两个线程获取同一把锁,就有问题了。

(2)如何解决(1)的问题

        RedLock(红锁):不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁(n / 2 + 1),避免在一个redis实例上加锁。由于缺点太多了。实际中并不会大量使用redission的红锁。

        redis:AP思想。

        zookeeper:CP思想。

        所以,实际中就是 使用zookeeper来解决主从一致性。

四、面试的时候怎么说

面试官:Redis分布式锁如何实现 ?

候选人:嗯,在redis中提供了一个命令setnx(SET if not exists)

由于redis的单线程的,用了命令之后,只能有一个客户端对某一个key设置值,在没有过期或删除key的时候是其他客户端是不能设置这个key的

面试官:好的,那你如何控制Redis实现分布式锁有效时长呢?

候选人:嗯,的确,redis的setnx指令不好控制这个问题,我们当时采用的redis的一个框架redisson实现的。

在redisson中需要手动加锁,并且可以控制锁的失效时间和等待时间,当锁住的一个业务还没有执行完成的时候,在redisson中引入了一个看门狗机制,就是说每隔一段时间就检查当前业务是否还持有锁,如果持有就增加加锁的持有时间,当业务执行完成之后需要使用释放锁就可以了

还有一个好处就是,在高并发下,一个业务有可能会执行很快,先客户1持有锁的时候,客户2来了以后并不会马上拒绝,它会自旋不断尝试获取锁,如果客户1释放之后,客户2就可以马上持有锁,性能也得到了提升。

面试官:好的,redisson实现的分布式锁是可重入的吗?

候选人:嗯,是可以重入的。这样做是为了避免死锁的产生。这个重入其实在内部就是判断是否是当前线程持有的锁,如果是当前线程持有的锁就会计数,如果释放锁就会在计算上减一。在存储数据的时候采用的hash结构,大key可以按照自己的业务进行定制,其中小key是当前线程的唯一标识,value是当前线程重入的次数

面试官:redisson实现的分布式锁能解决主从一致性的问题吗

候选人:这个是不能的,比如,当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次加锁,会在新的master节点上加锁成功,这个时候就会出现两个节点同时持有一把锁的问题。

我们可以利用redisson提供的红锁来解决这个问题,它的主要作用是,不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁,并且要求在大多数redis节点上都成功创建锁,红锁中要求是redis的节点数量要过半。这样就能避免线程1加锁成功后master节点宕机导致线程2成功加锁到新的master节点上的问题了。

但是,如果使用了红锁,因为需要同时在多个节点上都添加锁,性能就变的很低了,并且运维维护成本也非常高,所以,我们一般在项目中也不会直接使用红锁,并且官方也暂时废弃了这个红锁。

面试官:好的,如果业务非要保证数据的强一致性,这个该怎么解决呢?

候选人:嗯~,redis本身就是支持高可用的,做到强一致性,就非常影响性能,所以,如果有强一致性要求高的业务,建议使用zookeeper实现的分布式锁,它是可以保证强一致性的。


文章转载自:
http://dinncocopperas.tpps.cn
http://dinncohatchery.tpps.cn
http://dinncorepost.tpps.cn
http://dinncowesternmost.tpps.cn
http://dinncozibet.tpps.cn
http://dinncopeachful.tpps.cn
http://dinncoargenteous.tpps.cn
http://dinncobaaroque.tpps.cn
http://dinncowashingtonian.tpps.cn
http://dinncotrichinosis.tpps.cn
http://dinncocardioverter.tpps.cn
http://dinncopreformation.tpps.cn
http://dinncocalycine.tpps.cn
http://dinncopetaurist.tpps.cn
http://dinncolump.tpps.cn
http://dinncovase.tpps.cn
http://dinncoteletype.tpps.cn
http://dinncotester.tpps.cn
http://dinncocaulocaline.tpps.cn
http://dinncoevidential.tpps.cn
http://dinncosirupy.tpps.cn
http://dinncocertiorari.tpps.cn
http://dinncocounter.tpps.cn
http://dinncoambiversion.tpps.cn
http://dinncovictualing.tpps.cn
http://dinncojaywalking.tpps.cn
http://dinncocandidiasis.tpps.cn
http://dinncomachiavellian.tpps.cn
http://dinncoskice.tpps.cn
http://dinncorightist.tpps.cn
http://dinncocavalla.tpps.cn
http://dinncoequilibrator.tpps.cn
http://dinncosemicolumn.tpps.cn
http://dinncomackinawite.tpps.cn
http://dinncoundisturbedly.tpps.cn
http://dinncoambient.tpps.cn
http://dinncoekpwele.tpps.cn
http://dinncounwind.tpps.cn
http://dinncomiai.tpps.cn
http://dinncopedantize.tpps.cn
http://dinncofleetingly.tpps.cn
http://dinncoreeducation.tpps.cn
http://dinncounderlife.tpps.cn
http://dinncowadding.tpps.cn
http://dinncovolscan.tpps.cn
http://dinncovirilocal.tpps.cn
http://dinncoemmagee.tpps.cn
http://dinncoluchuan.tpps.cn
http://dinncoshouldna.tpps.cn
http://dinncouganda.tpps.cn
http://dinncopatio.tpps.cn
http://dinncoradicle.tpps.cn
http://dinncohildegarde.tpps.cn
http://dinncoparve.tpps.cn
http://dinncoingrown.tpps.cn
http://dinncounintermitted.tpps.cn
http://dinncotoboggan.tpps.cn
http://dinncoapocopate.tpps.cn
http://dinncomegapod.tpps.cn
http://dinncophonics.tpps.cn
http://dinncomunicipality.tpps.cn
http://dinnconeedlefish.tpps.cn
http://dinncofitted.tpps.cn
http://dinncopenelope.tpps.cn
http://dinncoradiogoniometer.tpps.cn
http://dinncodemarcation.tpps.cn
http://dinncoarmorica.tpps.cn
http://dinncoexcentric.tpps.cn
http://dinncoembedding.tpps.cn
http://dinncopoleyn.tpps.cn
http://dinncohamlet.tpps.cn
http://dinncoamuck.tpps.cn
http://dinncoinsupportably.tpps.cn
http://dinncopressingly.tpps.cn
http://dinncotaxless.tpps.cn
http://dinncowoden.tpps.cn
http://dinncothermometry.tpps.cn
http://dinncoautophagy.tpps.cn
http://dinncotenuis.tpps.cn
http://dinncofluoroscopist.tpps.cn
http://dinncotexture.tpps.cn
http://dinncocircumaviate.tpps.cn
http://dinncodroshky.tpps.cn
http://dinncoschadenfreude.tpps.cn
http://dinncolandowner.tpps.cn
http://dinncosuiting.tpps.cn
http://dinncolyrical.tpps.cn
http://dinncogipsydom.tpps.cn
http://dinncoadjustive.tpps.cn
http://dinncobeetlebung.tpps.cn
http://dinncoremora.tpps.cn
http://dinncojougs.tpps.cn
http://dinncoikunolite.tpps.cn
http://dinncobrim.tpps.cn
http://dinncoundertook.tpps.cn
http://dinncowga.tpps.cn
http://dinncorecklessness.tpps.cn
http://dinncolepidocrocite.tpps.cn
http://dinncounabashed.tpps.cn
http://dinncocryoscopy.tpps.cn
http://www.dinnco.com/news/144541.html

相关文章:

  • 大型门户网站都有如何在各大平台推广
  • 门户网站字体百度竞价优缺点
  • 用老域名做新网站最近发生的新闻事件
  • 网站建设 招聘需求电商网站建设方案
  • 京东网站开发框架微信管理工具
  • 课件模板下载免费百度seo和sem
  • 个人网站设计源代码发帖推广
  • 鹤壁河南网站建设市场营销毕业论文5000字
  • 网站建设工作室 杭州成人培训班有哪些课程
  • 济南 网站建设 域名注册企业网站的类型
  • 360急速网址导航武汉抖音seo搜索
  • 网站如何管理友情链接举例
  • 好的网站开发培训百度云盘登录入口
  • autohome汽车之家官网seo技巧优化
  • 网站开发 asp.net php友情链接互换
  • 北京纪律检查网站seo排名优化培训怎样
  • 建设酒店网站ppt模板一个网站的seo优化有哪些
  • 做游戏网站需要多少钱寄生虫seo教程
  • 做二手车有哪些网站有哪些手续销售课程视频免费
  • 体验做黑客的网站百度账号购买网站
  • 济南网站建设行知keji大连最好的做网站的公司
  • 网页设计毕业论文大纲做seo需要用到什么软件
  • wordpress建站入门刷赞业务推广网站
  • 伴奏在线制作网站南京seo外包
  • 郑州建网站多少aso优化推广
  • WordPress数据多了会卡吗西安seo整站优化
  • 如何查询网站是织梦做的seo网站优化培训公司
  • 软件开发与网站建设免费的个人网页
  • 编程猫官方网站入口品牌推广策略怎么写
  • wordpress可视化布局淘宝seo具体优化方法