CN114218135A - 一种基于Redis缓存的源端流控方法及系统 - Google Patents
一种基于Redis缓存的源端流控方法及系统 Download PDFInfo
- Publication number
- CN114218135A CN114218135A CN202111516892.7A CN202111516892A CN114218135A CN 114218135 A CN114218135 A CN 114218135A CN 202111516892 A CN202111516892 A CN 202111516892A CN 114218135 A CN114218135 A CN 114218135A
- Authority
- CN
- China
- Prior art keywords
- redis
- queue
- processing
- service
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 22
- 238000012545 processing Methods 0.000 claims abstract description 98
- 238000012217 deletion Methods 0.000 claims description 10
- 230000037430 deletion Effects 0.000 claims description 10
- 238000011161 development Methods 0.000 abstract description 4
- 230000000694 effects Effects 0.000 abstract description 4
- 230000000903 blocking effect Effects 0.000 description 5
- 239000002699 waste material Substances 0.000 description 5
- 238000010586 diagram Methods 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0893—Caches characterised by their organisation or structure
- G06F12/0895—Caches characterised by their organisation or structure of parts of caches, e.g. directory or tag array
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Advance Control (AREA)
Abstract
本发明公开了一种基于Redis缓存的源端流控方法及系统,属于后端服务技术开发领域;所述的方法具体步骤如下:S1在Redis中创建多条队列;S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列;S3从Redis队列中进行取操作取出请求并进行业务处理;S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用;本发明提出了基于Redis缓存的源端流控方法,使用Redis对需要调用到目的端的并发请求进行缓存,利用Redis列表的左进右出实现了队列的效果,并通过定时的取操作实现了接口调用的分流效果。有效的减轻了目的端的瞬时压力,避免了因为高并发引起的服务崩塌,保证了服务的可用性和稳定性。
Description
技术领域
本发明公开一种基于Redis缓存的源端流控方法及系统,涉及后端服务技术开发领域。
背景技术
在大型公司项目开发中,难免会涉及到多个服务或系统之间的相互调用和依赖。各服务产品之间的相互调用保证了功能的准确执行和整个系统的稳定运行,降低了耦合度。同时也增加了个服务产品之间的相互依赖程度。一个服务的崩溃可能会导致这个系统的瘫痪。
目前,在常见的后端开发项目中,很多项目已经实现了基于本项目的流控,即作为被请求方的流控控制,例如淘宝的双十一的抢购。但基于源端的流控少之又少,这种情况只存在于被调用方没有做流控且不能承受高并发的情景。在这种情况,只能在源端实现流控,缓解目的端的并发压力。
常见的流控可以通过消息队列来实现,但只是项目之间接口调用的话,消息队列未免有点大材小用。
Redis是完全开源的,遵守BSD协议,是一个基于内存的高性能的key-value数据库。Redis性能极高,读的速度是110000次/s,写的速度是81000次/s,并且支持丰富的数据类型,包括string,list,set,zset,hash等数据结构的存储。不同的数据结构就能轻松应付各种实用场景;
故现发明一种基于Redis缓存的源端流控方法及系统,以解决上述问题。
发明内容
本发明针对现有技术的问题,提供一种基于Redis缓存的源端流控方法及系统,所采用的技术方案为:一种基于Redis缓存的源端流控方法,所述的方法具体步骤如下:
S1在Redis中创建多条队列;
S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列;
S3从Redis队列中进行取操作取出请求并进行业务处理;
S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用。
所述S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列的具体步骤如下:
S201将需要调用目的端接口的参数变成JSON字符串;
S202使用Redis的List数据类型,通过LPUSH命令存入提前创建好的列表List内。
所述S3从Redis队列中进行取操作取出请求并进行业务处理的具体步骤如下:
S301创建定时任务,从队列中rpop出固定数据的元素进行业务处理;
S302使用while循环和BRPOPLPUSH命令堵塞去元素,并通过辅助列表保证执行结果。
所述S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用的具体步骤如下:
S401如果处理成功,将元素从辅助List删除;
S402处理失败则多次处理,超过失败次数进行删除。
一种基于Redis缓存的源端流控系统,所述的系统具体包括队列创建模块、请求存入模块、队列处理模块和业务处理模块:
队列创建模块:在Redis中创建多条队列;
请求存入模块:以JSON字串符形式将达到服务项目的请求依次存入Redis队列;
队列处理模块:从Redis队列中进行取操作取出请求并进行业务处理;
业务处理模块:对辅助List里的元素进行出队,并进行具体业务处理和接口调用。
所述请求存入模块具体包括参数处理模块和命令保存模块:
参数处理模块:将需要调用目的端接口的参数变成JSON字符串;
命令保存模块:使用Redis的List数据类型,通过LPUSH命令存入提前创建好的列表List内。
所述队列处理模块具体包括元素处理模块和执行处理模块:
元素处理模块:创建定时任务,从队列中rpop出固定数据的元素进行业务处理;
执行处理模块:使用while循环和BRPOPLPUSH命令堵塞去元素,并通过辅助列表保证执行结果。
所述业务处理模块具体包括元素删除模块和失败处理模块:
元素删除模块:如果处理成功,将元素从辅助List删除;
失败处理模块:处理失败则多次处理,超过失败次数进行删除。
本发明的有益效果为:本发明提出了基于Redis缓存的源端流控方法,使用Redis对需要调用到目的端的并发请求进行缓存,利用Redis列表的左进右出实现了队列的效果,并通过定时的取操作实现了接口调用的分流效果。有效的减轻了目的端的瞬时压力,避免了因为高并发引起的服务崩塌,保证了服务的可用性和稳定性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明方法的流程图;图2是本发明系统的结构示意图;图3是本发明实施例的实施示意图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定。
实施例一:
一种基于Redis缓存的源端流控方法,所述的方法具体步骤如下:
S1在Redis中创建多条队列;
S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列;
S3从Redis队列中进行取操作取出请求并进行业务处理;
S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用;
本发明提供一种基于Redis缓存的源端流控方法,在实现本发明方法之前,需要了解被调用方的并发能力,以及一次并发的处理时间;比如商城项目调用计费项目的订单接口,要先弄清楚订单接口一次可以处理的请求个数,每个请求的响应时间是多少;下面将以云服务中云硬盘项目一个定时任务场景作为示例:
首先按照S1在Redis中创建多条队列,每条队列对应一个业务场景,然后按照S2对同时到达服务项目的请求,以JSON字符串的形式依次存入Redis的队列;
进一步的,所述S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列的具体步骤如下:
S201将需要调用目的端接口的参数变成JSON字符串;
S202使用Redis的List数据类型,通过LPUSH命令存入提前创建好的列表List内;
进一步的,所述S3从Redis队列中进行取操作取出请求并进行业务处理的具体步骤如下:
S301创建定时任务,从队列中rpop出固定数据的元素进行业务处理;
S302使用while循环和BRPOPLPUSH命令堵塞去元素,并通过辅助列表保证执行结果;
再进一步的,所述S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用的具体步骤如下:
S401如果处理成功,将元素从辅助List删除;
S402处理失败则多次处理,超过失败次数进行删除;
在上述技术方案的基础中,使用到了Redis的List数据类型,并且使用lpush的方法进行入队操作;
在上述方案中,对同时并发的请求进行了缓存(存操作),下面将依次从Redis的队列里面取出请求(取操作),并进行具体的业务处理;
在上述技术方案的基础上,我们会选择使用while循环或者定时任务进行取操作:
方案一使用定时任务
创建定时任务,每两秒执行一次;
每次执行时,从队列中rpop出固定数目的元素,并进行业务处理,即调用被调用模块接口;
方案二使用while循环
创建while循环;在while循环中,根据被调用模块的并发性能(比如每次处理10个请求,一次请求的处理时间为2s),每次从队列中rpop出十个对象(与前面的lpush形成呼应,左进右出,list便成了队列),开始调用被调用方接口进行具体业务处理;并在每次接到响应后,睡眠2s(Thread.sleep()),在睡眠结束后继续开始下一次循环,直至队列中没有对象;
方案三使用堵塞的while循环
在方案2中,虽然能解决流控的问题,即将同时到达的请求缓存,并每隔2s进行一次取操作,进行业务处理;但是while循环会一直运作,不停的占用线程,牺牲机器性能;
所以在本发明方法中将对方案2进行优化;具体操作如下;
如方案一类似,使用while循环,每次使用Redis的brpop进行堵塞去除;brpop的具体操作是指:移出并获取列表的最后一个元素,如果列表没有元素会一直阻塞列表直到发现可弹出元素为止;这样的话,当队列中没有元素的时候,while循环就会堵塞不执行,避免了过多的线程占用和性能浪费,同时,也不会影响具体业务的处理和实现;此为方法一的优化;
方案三安全地使用堵塞的while循环
在方案三中,实现了堵塞队列,能避免没有请求的时的空转,减少系统资源浪费,但是没法保证业务的正确执行;
该方案使用Redis的brpoplpush命令,从列表中取出最后一个元素,并插入到另外一个列表(辅助列表)的头部,在业务处理完成之后,如果处理成功就删除辅助列表元素,如果失败继续放在对头,在下一个循环时,再处理一遍;
综上四种方法,方案一使用定时任务,调用频率过高会造成系统资源浪费;方案二,使用while循环同样会造成系统资源浪费;方案三对方案二进行了优化,使用堵塞队列,避免了空转,减少了资源浪费,但元素取出后就不管后续执行成功还是失败;方案四使用堵塞队列,并引入辅助列表暂存处理元素,保证执行失败后还能再次执行。
实施例二:
一种基于Redis缓存的源端流控系统,所述的系统具体包括队列创建模块、请求存入模块、队列处理模块和业务处理模块:
队列创建模块:在Redis中创建多条队列;
请求存入模块:以JSON字串符形式将达到服务项目的请求依次存入Redis队列;
队列处理模块:从Redis队列中进行取操作取出请求并进行业务处理;
业务处理模块:对辅助List里的元素进行出队,并进行具体业务处理和接口调用;
进一步的,所述请求存入模块具体包括参数处理模块和命令保存模块:
参数处理模块:将需要调用目的端接口的参数变成JSON字符串;
命令保存模块:使用Redis的List数据类型,通过LPUSH命令存入提前创建好的列表List内;
进一步的,所述队列处理模块具体包括元素处理模块和执行处理模块:
元素处理模块:创建定时任务,从队列中rpop出固定数据的元素进行业务处理;
执行处理模块:使用while循环和BRPOPLPUSH命令堵塞去元素,并通过辅助列表保证执行结果;
再进一步的,所述业务处理模块具体包括元素删除模块和失败处理模块:
元素删除模块:如果处理成功,将元素从辅助List删除;
失败处理模块:处理失败则多次处理,超过失败次数进行删除。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (8)
1.一种基于Redis缓存的源端流控方法,其特征是所述的方法具体步骤如下:
S1在Redis中创建多条队列;
S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列;
S3从Redis队列中进行取操作取出请求并进行业务处理;
S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用。
2.根据权利要求1所述的方法,其特征是所述S2以JSON字串符形式将达到服务项目的请求依次存入Redis队列的具体步骤如下:
S201将需要调用目的端接口的参数变成JSON字符串;
S202使用Redis的List数据类型,通过LPUSH命令存入提前创建好的列表List内。
3.根据权利要求2所述的方法,其特征是所述S3从Redis队列中进行取操作取出请求并进行业务处理的具体步骤如下:
S301创建定时任务,从队列中rpop出固定数据的元素进行业务处理;
S302使用while循环和BRPOPLPUSH命令堵塞去元素,并通过辅助列表保证执行结果。
4.根据权利要求3所述的方法,其特征是所述S4对辅助List里的元素进行出队,并进行具体业务处理和接口调用的具体步骤如下:
S401如果处理成功,将元素从辅助List删除;
S402处理失败则多次处理,超过失败次数进行删除。
5.一种基于Redis缓存的源端流控系统,其特征是所述的系统具体包括队列创建模块、请求存入模块、队列处理模块和业务处理模块:
队列创建模块:在Redis中创建多条队列;
请求存入模块:以JSON字串符形式将达到服务项目的请求依次存入Redis队列;
队列处理模块:从Redis队列中进行取操作取出请求并进行业务处理;
业务处理模块:对辅助List里的元素进行出队,并进行具体业务处理和接口调用。
6.根据权利要求5所述的系统,其特征是所述请求存入模块具体包括参数处理模块和命令保存模块:
参数处理模块:将需要调用目的端接口的参数变成JSON字符串;
命令保存模块:使用Redis的List数据类型,通过LPUSH命令存入提前创建好的列表List内。
7.根据权利要求6所述的系统,其特征是所述队列处理模块具体包括元素处理模块和执行处理模块:
元素处理模块:创建定时任务,从队列中rpop出固定数据的元素进行业务处理;
执行处理模块:使用while循环和BRPOPLPUSH命令堵塞去元素,并通过辅助列表保证执行结果。
8.根据权利要求7所述的系统,其特征是所述业务处理模块具体包括元素删除模块和失败处理模块:
元素删除模块:如果处理成功,将元素从辅助List删除;
失败处理模块:处理失败则多次处理,超过失败次数进行删除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111516892.7A CN114218135A (zh) | 2021-12-13 | 2021-12-13 | 一种基于Redis缓存的源端流控方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111516892.7A CN114218135A (zh) | 2021-12-13 | 2021-12-13 | 一种基于Redis缓存的源端流控方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114218135A true CN114218135A (zh) | 2022-03-22 |
Family
ID=80701221
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111516892.7A Pending CN114218135A (zh) | 2021-12-13 | 2021-12-13 | 一种基于Redis缓存的源端流控方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114218135A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117112267A (zh) * | 2023-10-20 | 2023-11-24 | 成都华栖云科技有限公司 | 一种应用接口的缓存维护方法 |
CN117194549A (zh) * | 2023-11-07 | 2023-12-08 | 上海柯林布瑞信息技术有限公司 | 基于任务数据配置的数据传输方法及装置 |
-
2021
- 2021-12-13 CN CN202111516892.7A patent/CN114218135A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117112267A (zh) * | 2023-10-20 | 2023-11-24 | 成都华栖云科技有限公司 | 一种应用接口的缓存维护方法 |
CN117112267B (zh) * | 2023-10-20 | 2024-01-23 | 成都华栖云科技有限公司 | 一种应用接口的缓存维护方法 |
CN117194549A (zh) * | 2023-11-07 | 2023-12-08 | 上海柯林布瑞信息技术有限公司 | 基于任务数据配置的数据传输方法及装置 |
CN117194549B (zh) * | 2023-11-07 | 2024-01-26 | 上海柯林布瑞信息技术有限公司 | 基于任务数据配置的数据传输方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9501319B2 (en) | Method and apparatus for scheduling blocking tasks | |
CN114218135A (zh) | 一种基于Redis缓存的源端流控方法及系统 | |
US9852220B1 (en) | Distributed workflow management system | |
US9836516B2 (en) | Parallel scanners for log based replication | |
CN107704310B (zh) | 一种实现容器集群管理的方法、装置和设备 | |
CN103412786A (zh) | 一种高性能服务器架构系统及数据处理方法 | |
CN112650599A (zh) | 一种日志处理方法、设备及存储介质 | |
CN111400016B (zh) | 一种调用应用程序接口函数的方法和设备 | |
CN112463290A (zh) | 动态调整计算容器的数量的方法、系统、装置和存储介质 | |
WO2024156239A1 (zh) | 视频流传输方法、装置、电子设备及存储介质 | |
CN111294377A (zh) | 一种依赖关系的网络请求发送方法、终端装置及存储介质 | |
CN112306695A (zh) | 数据的处理方法、装置、电子设备及计算机存储介质 | |
WO2024001411A1 (zh) | 多线程调度方法及装置 | |
CN109951532B (zh) | 一种基于dpdk的流量模型自动变换装置 | |
CN111124355A (zh) | 信息处理方法、装置、可读存储介质及电子设备 | |
CN116028226A (zh) | 一种基于量子计算设备dpdk组件图像数据排序方法、存储装置和智能终端 | |
WO2022151766A1 (zh) | 一种io请求流水线处理设备、方法、系统及存储介质 | |
CN114553959A (zh) | 基于态势感知的云原生服务网格配置按需下发方法及应用 | |
CN110445874B (zh) | 一种会话处理方法、装置、设备和存储介质 | |
CN111090513B (zh) | 车联网平台终端链路健康状态的检测方法及存储介质 | |
CN103488530A (zh) | 一种锁迁移方法及装置 | |
CN116991562B (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
CN111858002B (zh) | 一种基于异步io的并发处理方法、系统及装置 | |
CN111881085B (zh) | 一种读写带宽性能的优化方法及系统 | |
US10140150B2 (en) | Thread diversion awaiting log call return |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |