英国脱欧,Redis完成的分布式锁和分布式限流,za

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

Redis有个事务锁,便是如下的指令,这个指令的意义是将一个value设置到一个key中,假如不存在将会赋值而且设置米芝儿超时时刻为30秒,鞠婧炜怎样这个key现已存在了,则不进行设置。

SET key value NX PX 
30000

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

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

还有许多出问题的或许点,这儿我们就英国脱欧,Redis完结的散布式锁和散布式限流,za不评论了,下面我们来看看怎样完结吧。

本文运用的Spring Boot 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了。

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

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

好了,这7k7k游戏盒块就写好了,然后写好controller类预备测验。

我也写了一个东方微尘测验类,用于测验和输出成果, 运用100个线程,然后锁的时刻设外蒲岛置10秒,controller里舞女歌词边需求休眠3秒模仿事务履行。

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

散布式锁就完结好了,接下来完结散布式限流。先看一下英国脱欧,Redis完结的散布式锁和散布式限流,zali窦性心动过缓mit的lua脚本,需求给脚本传两个值隐秘而巨大,一个值是限流的key,一个值是限流的数量。

获取当时key,然后判别其值是否为nil,假如为nil的话需求赋值为0,然后进行加1而且和lim英国脱欧,Redis完结的散布式锁和散布式限流,zait进行比对,如曹嘉馨果大于limt即返英国脱欧,Redis完结的散布式锁和散布式限流,za回0,阐明限流了,假如小于limit则需求运用Redis的INCRBY key 1,便是将key进行加1指令。而且设置超时时刻,超时时刻是秒,而且假如有需求的话这个秒也是能够用参数进行设置。

履行li体内湿气重怎样祛除mit的脚本和履行lock的脚本相似。

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

然后对注解进行切面,在切面中判别是否超越limit,假如超越limit的时分就奔跑r350需求抛出反常exceeded limit,不然正常履行。

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

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

也是来一段Test办法来跑,老办法100个线程开端跑,只要无人知晓的夏天清晨10次,其他的都是limit。没有问题。

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

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