<small id='I5UhrDy'></small> <noframes id='qrTa4cB1W'>

  • <tfoot id='mt2pldkq7H'></tfoot>

      <legend id='Mz3iaK'><style id='9DANX'><dir id='hwR3WZmCv'><q id='gQuF'></q></dir></style></legend>
      <i id='mPJox'><tr id='Q4BwsH'><dt id='8mTfW'><q id='1XMEGOx2'><span id='cnGaBUvRb7'><b id='ydPKT5bs'><form id='wYsvbz1'><ins id='5Yxo2EcqyU'></ins><ul id='17VJ'></ul><sub id='cRqrW'></sub></form><legend id='dEn6AC0'></legend><bdo id='ACVSZw'><pre id='AhOib'><center id='EeHV'></center></pre></bdo></b><th id='SIXhU1xL3T'></th></span></q></dt></tr></i><div id='VChlwfo7'><tfoot id='ZJv3y8E'></tfoot><dl id='1QUN'><fieldset id='vXzieBoY'></fieldset></dl></div>

          <bdo id='rbApEoVDNh'></bdo><ul id='MKmdGt'></ul>

          1. <li id='srez'></li>
            登陆

            Redis完成的分布式锁和分布式限流

            admin 2019-05-17 175人围观 ,发现0个评论

            跟着现在散布式越来越遍及,散布式锁也十分常用,这篇文章解说了 运用zookeeper完成散布式锁,本次我们说一下怎样用Redis完成散布式锁和散布限流。

            Redis有个事务锁,便是如下的指令,这个指令的意义是将一个value设置到一个keRedis完成的分布式锁和分布式限流y中,假如不存在将会赋值而且设置超时时刻为30秒,怎样这个key现已存在了,则不进行设置。

            SET key value NX PX 
            30000

            这个事务锁很好的处理了两个独自的指令,一个设置set key value nx,即该key不存在的话将对其进Redis完成的分布式锁和分布式限流行设置,另一个是expire key seconds,设置该key的超时时刻。我们能够想一下,假如这两个指令Redis完成的分布式锁和分布式限流用程序独自运用会存在什么问题:

            • 假如一个set key的指令设置了key,然后程序反常了,expire时刻没有设置,那么这个key会一向锁住。
            • 假如一个set key时呈现了反常,可是直接履行了expire,过了一瞬间之后另一个进行set key,还没怎样履行代码,成果key过期了,其他线程也进入了锁。

            还有许多出问题的或许点,这儿我们就不评论了,下面我们来看看怎样完成吧。

            本文运用的Spring BootRedis完成的分布式锁和分布式限流 2.x + Spring data redis + Swagger +lombok + AOP + lua脚本。在完成的进程中遇到了许多问题,都逐个处理完成了。

            依靠的POM文件如下:

            运用了两个lua脚本,一个想念用于履行lock,另一个履行unlock。

            我们简略看一下,lock脚本便是选用Redis事务履行的set nx px指令,其实还有set nx ex指令,这个ex指令是选用秒的办法进行设置过期时刻,这个px是选用毫秒的办法设置过期时刻。

            value需求运用一个仅有的值,这个值在解锁的时分需求判别是否共同,假如共同的话就进行解锁。这个也是官方引荐的办法。别的在lock的当地我设置了一个result,用于输出测验时的成果,这样就能够结合程序去进行debug了。

            来看下代码,首要写了两个办法,一个是用与锁别的一个是用于结解锁。这块需求留意的是运用RedisTemplate,这块意味着key和value必定都是String的,我在运用的进程中就呈现了一些过错。首要初始化两个脚本到程序中,然后调用履行脚本。

            还有一个便是脚本界说的当地需求留意,回来的成果集必定是Long, Boolean,List, 一个反序列化的值。这块要留意。

            好了,这块就写好了,然后写好controller类预备测验。

            我也写了一个测验类,用于测验和输出成果, 运用100个线程,然后锁的时刻设置10秒,controller里面需求休眠3秒模仿事务履行。

            获取锁的当地就会履行do business logic, 然后会有部分线程获取到锁并履行事务,履行完事务的就会开释锁。

            散布式锁就完成好了,接下来完成散布式限流。先看一下limit的lua脚本,需求给脚本传两个值,一个值是限流的key,一个值是限流的数量。

            获取当时key,然后判别其值是否为nil,假如为nil的话需求赋值为0,然后进行加1而且和limit进行比对,假如大于limt即回来0,阐明限流了,假如小于limit则需求运用Redis的INCRBY key 1,便是将key进行加1指令。而且设置超时时刻,超时时刻是秒,而且假如有需求的话这个秒也是能够用参数进行设置。

            履行limit的脚本和履行lock的脚本相似。

            接下来我们写一个限流注解,而且设置注解的key和限流的巨细:

            然后对注解进行切面,在切面中判别是否Redis完成的分布式锁和分布式限流超越limit,假如超越limit的时分就需求抛出反常exceeded limit,不然正常履行。

            由于有抛出反常,这儿我弄了一个一致的controller过错处理,假如controller呈现Exception的时分都需求走这块反常。假如是正常的RunTimeException的时分获取一下,不然将反常获取一下而且输出。

            好了,接下来将注解写到自界说的controller上,limit的巨细为10,也便是10秒钟内约束10次拜访。

            也是来一段Test办法来跑,老办法100个线程开端跑,只要10次,其他的都是limit。没有问题。

            总结一下,这次完成选用了运用lua脚本和Redis完成了锁和限流,可是实在运用的时分还需求多测验,别的假如此次Redis也是选用的单机完成办法,运用集群的时分或许需求改造Redis完成的分布式锁和分布式限流一下。

            关于锁这块其实Reids自己也完成了RedLock, java完成的版别Redission。也有许多公司运用了,功用十分强壮。各种场景下都用到了。

            章鱼竞猜下载-凯恩股份关于控股股东凯恩集团有限公司终止实施增持计划的公告

            2019-09-16
          2.   本公司董事会及全体董事

          3. 江苏雄图高科技股份有限公司关于完结工商改变挂号的布告

            2019-09-16
          4.   关于监事辞职及补选公司监事候选人的公告

              本公司及监事会全体成员

            深圳市雄韬电源科技股份有限公司关于监事辞去职务及补选公司监事提名人的布告

            2019-09-16
          5.   关于重大资产购买暨

            杭叉集团股份有限公司关于重大资产购买暨关联交易进展的公告

            2019-09-16
          6. 请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP