一种基于java的redis分布式限流方法及系统技术方案

技术编号:36531983 阅读:17 留言:0更新日期:2023-02-01 16:15
本发明专利技术公开了一种基于java的redis分布式限流方法及系统,其方法包括:获取业务终端输入的关键字;对关键字调用decr命令,将该关键字在redis中的次限数减1,然后返回剩余的次限数;调用ttl命令得到剩余的有效时间并向redis返回剩余的有效时间;若剩余的有效时间不小于0则执行次限数计算步骤;判断更新后的次限数是否小于1,若是则向业务终端返回false,若否则向业务终端返回true。其系统包括关键字获取模块、数据获取模块、有效时间计算模块和次限数计算模块。所述基于java的redis分布式限流方法机系统解决了现有的分布式限流方法兼容性差以及会提高网络负担的问题。性差以及会提高网络负担的问题。性差以及会提高网络负担的问题。

【技术实现步骤摘要】
一种基于java的redis分布式限流方法及系统


[0001]本专利技术涉及流量管理领域,特别涉及一种基于java的redis分布式限流方法及系统。

技术介绍

[0002]限流是指通过一定的方法限制某段代码的在一定时间内的执行次数。分布式限流就是,同一工程布署多个节点,在负载均衡的作用中,对同一功能的请求每次会由不同节点去处理,这时对某一功能的限流就是对多节点集群关于该功能的限流,比如:对一个节点数为30的集群中的功能A限制5秒内访问不超过1000次;分布式限流的实现方法有很多,有基于数据库的,有基于zookeeper的,也有基于redis的等等。目前行业内基于redis实现的分布式限流,普遍都是基于redis的lua脚本命令来实现的。这种实现方式存在以下问题:1、每次调用redis都要发送lua脚本,对于高并要求的项目会带来一定的网络负担;2、存在兼容问题,在测试环境和线上环境中,每家的部署方案并不相同,有的是单节点的redis,有的是代理集群的redis,有的是redis集群部署,而redis关于lua的命令,不同版本或不同的集群代理器上的redis的支持度并不一样,如此,就会造成在测试环境时,所用的lua脚本执行没问题,但到了正式环境会出现bug,或者有可能在这家所用的lua脚本执行没问题,同机的lua脚本复制到另一家执行就不通过。

技术实现思路

[0003]为了克服现有技术存在的缺陷,本专利技术提供一种,以解决上述的问题;本专利技术解决其技术问题所采用的技术方案是:一种基于java的redis分布式限流方法,在java应用上执行,包括:关键字获取步骤:获取业务终端输入的关键字;数据获取步骤:对关键字调用decr命令,将该关键字存储在redis中的次限数减1,然后返回剩余的次限数;调用ttl命令得到剩余的有效时间并向redis返回剩余的有效时间;有效时间计算步骤:若剩余的有效时间不小于0则执行次限数计算步骤;次限数计算步骤:判断剩余的次限数是否小于1,若是则向业务终端返回false,若否则向业务终端返回true;其中,返回false为限流,返回true为通过限流;值得说明的是,在所述关键字获取步骤中,获取业务终端输入的关键字后,调用setNx命令,检查redis中有没有该关键字,若有则执行数据获取步骤;若没有则设置关键字的次限数和关键字的有效时间后向业务终端返回true;可选的,在所述有效时间计算步骤中,判断剩余的有效时间是否小于0,若是则调用del命令删除在redis中记录的关键字的次限数和有效时间;若否则执行次限数计算步骤;
优选的,在所述有效时间计算步骤中,在调用del命令删除在redis中记录的关键字的次限数和有效时间后,调用setNx命令重新对关键字设置次限数和有效时间,并向业务终端返回true;具体地,在所述有效时间计算步骤中,设置的次限数以key

value的形式存储于redis中,使所述关键字与所述次限数一一对应,其中,key为关键字,value为次限数;值得说明的是,一种基于java的redis分布式限流系统,应用于java应用中,包括关键字获取模块、数据获取模块、有效时间计算模块和次限数计算模块;所述关键字获取模块用于获取业务终端输入的关键字;所述数据获取模块用于对关键字调用decr命令,将该关键字存储在redis中的次限数减1,然后返回剩余的次限数;用于调用ttl命令得到剩余的有效时间并向redis返回剩余的有效时间;所述有效时间计算模块用于若剩余的有效时间不小于0则执行次限数计算模块;所述次限数计算模块用于判断剩余的次限数是否小于1,若是则向业务终端返回false,若否则向业务终端返回true;其中,返回false为限流,返回true为通过限流;可选的,述关键字获取模块还用于在获取业务终端输入的关键字后,调用setNx命令,检查redis中有没有该关键字,若有则执行数据获取步骤;若没有则设置关键字的次限数和关键字的有效时间后向业务终端返回true;具体地,述有效时间计算模块还用于判断剩余的有效时间是否小于0,若是则调用del命令删除在redis中记录的关键字的次限数和有效时间,若否则执行次限数计算步骤;优选的,述有效时间计算模块还用于调用del命令删除在redis中记录的关键字的次限数和有效时间后,调用setNx命令重新对关键字获取次限数和有效时间,并向业务终端返回true;值得说明的是,所述有效时间计算模块中,设置的次限数以key

value的形式存储于redis中,使所述关键字与所述次限数一一对应,其中,key为关键字,value为次限数;本专利技术的有益效果在于:在所述基于java的redis分布式限流方法中,将分布式限流的逻辑写在java里,从而解决了lua脚本命令的兼容问题以及使用lua脚本是带来的网络负担问题。通过所述基于java的redis分布式限流方法,业务终端每次访问都在一个地方计数并返回当前次限数,当返回的次限数还没有达到上限时返回true,通过限流,否则返回false,被限流;如此,根据此返回判断是否继续执行接下来的代码。
附图说明
[0004]图1为本专利技术的一个实施例中基于java的redis分布式限流方法的流程图;图2为本专利技术的一个实施例中基于java的redis分布式限流系统的系统框图。
具体实施方式
[0005]下面结合附图对本专利技术的具体实施方式作进一步说明。在此需要说明的是,对于这些实施方式的说明用于帮助理解本专利技术,但并不构成对本专利技术的限定。此外,下面所描述的本专利技术各个实施方式中所涉及的技术特征只要彼此之间未构成冲突就可以相互组合;如图1所示,一种基于java的redis分布式限流方法,在java应用上执行,包括:
关键字获取步骤:获取业务终端输入的关键字;在本实施例中,所述次限数表示关键字限制访问的次数,所述有效时间表示关键字受限制访问的时长;在执行所述关键字获取步骤前,先调用redis上下文获取连接池;数据获取步骤:对关键字调用decr命令,将该关键字存储在redis中的次限数减1,然后返回剩余的次限数;调用ttl命令得到剩余的有效时间并向redis返回剩余的有效时间;有效时间计算步骤:若剩余的有效时间不小于0则执行次限数计算步骤;在本实施例中,当剩余的有效时间不小于0,表示当前时刻已经超过了关键字受限制访问的时长;次限数计算步骤:判断剩余的次限数是否小于1,若是则向业务终端返回false,若否则向业务终端返回true;其中,返回false为限流,返回true为通过限流。在本实施例中,当更新后的次限数小于1,表示关键字的访问次数已经超过限制访问的次数,此次访问会限流,当更新后的次限数不小于1,表示关键字的访问次数还没超过限制访问的次数,次数访问能通过限流;在所述基于java的redis分布式限流方法中,将分布式限流的逻辑写在java里,从而解决了lua脚本命令的兼容问题以及使用lua脚本是带来的网络负担问题。通过所述基于java的redis分布式限流方法,业务终端每次访问都在一个地方计数并返回当前本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于java的redis分布式限流方法,其特征在于,在java应用上执行,包括:关键字获取步骤:获取业务终端输入的关键字;数据获取步骤:对关键字调用decr命令,将该关键字存储在redis中的次限数减1,得到剩余的次限数,然后返回剩余的次限数;调用ttl命令得到剩余的有效时间并向redis返回剩余的有效时间;有效时间计算步骤:若剩余的有效时间不小于0则执行次限数计算步骤;次限数计算步骤:判断剩余的次限数是否小于1,若是则向业务终端返回false,若否则向业务终端返回true;其中,返回false为限流,返回true为通过限流。2.根据权利要求1所述的一种基于java的redis分布式限流方法,其特征在于:在所述关键字获取步骤中,获取业务终端输入的关键字后,调用setNx命令,检查redis中有没有该关键字,若有则执行数据获取步骤;若没有则设置关键字的次限数和关键字的有效时间后向业务终端返回true。3.根据权利要求2所述的一种基于java的redis分布式限流方法,其特征在于:在所述有效时间计算步骤中,判断剩余的有效时间是否小于0,若是则调用del命令删除在redis中记录的关键字的次限数和有效时间;若否则执行次限数计算步骤。4.根据权利要求3所述的一种基于java的redis分布式限流方法,其特征在于:在所述有效时间计算步骤中,在调用del命令删除在redis中记录的关键字的次限数和有效时间后,调用setNx命令重新对关键字设置次限数和有效时间,并向业务终端返回true。5.根据权利要求2所述的一种基于java的redis分布式限流方法,其特征在于:在所述有效时间计算步骤中,设置的次限数以key

value的形式存储于redis中,使所述关键字与所述次限数一一对应,其中,key为关键字,value为次限数。6.一种基于java的redis分布式限流系统,其...

【专利技术属性】
技术研发人员:李宝君何玉华
申请(专利权)人:全通金信控股广东有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1