掌桥专利:专业的专利平台
掌桥专利
首页

redis-JavaSDK压力测试方法及装置

文献发布时间:2024-01-17 01:28:27


redis-JavaSDK压力测试方法及装置

技术领域

本申请涉及压力测试领域,可应用于金融领域和其他领域,尤指一种redis-JavaSDK压力测试方法及装置。

背景技术

企业在上线支持redis命令的产品时,需要对该产品进行多方面的测试,但常用的压力测试工具往往功能零散,不能覆盖足够多的指标和场景,例如redis-benchmark不支持监控功能,无法实时观测压测数据、JMeter只是发送报文请求并没有结合redis-JavaSDK,而调用方都是通过redis-JavaSDK对redis进行操作,所以这样的压力测试工具往往并不能得出真实的数据,并且JMeter没有限流功能,无法进行稳定性测试,基于以上背景总结了现有压测工具有以下缺点:1.现有压力测试工具功能零散,不能覆盖足够多的指标和场景。2.现有压力测试工具不能支持从redis-JavaSDK开始执行命令。调用方无法得到真实的压测数据。

发明内容

本申请目的在于提供一种redis-JavaSDK压力测试方法及装置,以覆盖目前的大多数压力测试所需要的场景和指标,对支持redis命令的产品进行全方位的测试。

为达上述目的,本申请所提供的redis-JavaSDK压力测试方法具体包含:根据用户提供的配置参数和预存的配置项生成配置文件;根据所述配置文件中线程参数设定对应的线程执行数据,以及根据所述配置文件中的客户端对象和命令集对象于预存的多个客户端信息和多种命令信息中获取对应的客户端信息和命令信息;根据所述线程执行数据、所述客户端信息和所述命令信息向执行器提供对应的调用接口,由执行器通过execute方法执行对应的redis-JavaSDK压力测试。

在上述redis-JavaSDK压力测试方法中,可选的,根据所述配置文件中的客户端对象和命令集对象于预存的多个客户端信息和多种命令信息中获取对应的客户端信息和命令信息包含:根据所述配置文件中client下sdk配置项,于预存的多个客户端信息中调取执行命令的对应的客户端信息;根据所述配置文件中key下commands配置项,于预存的多个命令信息中调取待执行的命令信息。

在上述redis-JavaSDK压力测试方法中,可选的,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试包含:所述执行器通过execute方法根据所述调用接口调用选择器中get方法获得所述客户端信息和所述命令信息;根据所述客户端信息和所述命令信息按所述线程执行数据对应的线程数通过反射的方式执行对应的redis-JavaSDK压力测试。

在上述redis-JavaSDK压力测试方法中,可选的,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试之前包含:根据所述配置文件获得限流阈值,根据所述限流阈值对所述执行器的测试频率进行限流。

在上述redis-JavaSDK压力测试方法中,可选的,根据所述限流阈值对所述执行器的测试频率进行限流包含:根据所述限流阈值通过令牌桶算法按对应速率的令牌;通过令牌维持所述执行器内执行线程执行对应的redis-JavaSDK压力测试。

在上述redis-JavaSDK压力测试方法中,可选的,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试之后包含:统计所述执行器通过execute方法执行对应的redis-JavaSDK压力测试的测试数量获得统计结果,将统计结果提供至预定地址。

在上述redis-JavaSDK压力测试方法中,可选的,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试还包含:根据所述配置文件中的key配置项和value配置项获得指定长度;采用ThreadLocalRandom来生成随机数,通过TheadLocalRandom内部Map中key存储当前线程ID,value存储当前seed;以及,利用StringBuilder来拼接字符串,且所述字符串长度小于所述指定长度时,向系统申请资源所带来消耗。

本申请还提供一种redis-JavaSDK压力测试装置,所述装置包含配置模块、线程工厂、数据库、选择器和执行器;所述配置模块用于根据用户提供的配置参数和预存的配置项生成配置文件;所述线程工厂用于根据所述配置文件中线程参数设定对应的线程执行数据;所述数据库用于预存多个客户端信息和多种命令信息;所述选择器分别与所述线程工厂和所述数据库相连,用于根据所述配置文件中的客户端对象和命令集对象于预存的多个客户端信息和多种命令信息中获取对应的客户端信息和命令信息,并根据所述线程执行数据、所述客户端信息和所述命令信息向执行器提供对应的调用接口;所述执行器与所述选择器相连,用于根据所述调用接口调用客户端信息、命令信息和所述线程执行数据,通过execute方法执行对应的redis-JavaSDK压力测试。

本申请还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法。

本申请还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述方法的计算机程序。

本申请还提供一种计算机程序产品,包括计算机程序/指令,该计算机程序/指令被处理器执行时实现上述方法的步骤。

本申请的有益技术效果在于:可以对支持redis命令的产品进行全方位的测试,在功能拓展性上也有良好的表现。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,并不构成对本申请的限定。在附图中:

图1为本申请一实施例所提供的redis-JavaSDK压力测试方法的流程示意图;

图2为本申请一实施例所提供的execute方法执行流程示意图;

图3为本申请一实施例所提供的限流流程示意图;

图4为本申请一实施例所提供的redis-JavaSDK压力测试装置的结构示意图;

图5为本申请一实施例所提供的redis-JavaSDK压力测试装置的应用流程示意图;

图6为本申请一实施例所提供的电子设备的结构示意图。

具体实施方式

以下将结合附图及实施例来详细说明本申请的实施方式,借此对本申请如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明的是,只要不构成冲突,本申请中的各个实施例及各实施例中的各个特征可以相互结合,所形成的技术方案均在本申请的保护范围之内。

另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

请参考图1所示,本申请所提供的redis-JavaSDK压力测试方法具体包含:

S101根据用户提供的配置参数和预存的配置项生成配置文件;

S102根据所述配置文件中线程参数设定对应的线程执行数据,以及根据所述配置文件中的客户端对象和命令集对象于预存的多个客户端信息和多种命令信息中获取对应的客户端信息和命令信息;

S103根据所述线程执行数据、所述客户端信息和所述命令信息向执行器提供对应的调用接口,由执行器通过execute方法执行对应的redis-JavaSDK压力测试。

使用该方法后,可以对支持redis命令的产品进行全方位的测试,在功能拓展性上也有良好的表现。进一步的,

在上述redis-JavaSDK压力测试方法中,可选的,根据所述配置文件中的客户端对象和命令集对象于预存的多个客户端信息和多种命令信息中获取对应的客户端信息和命令信息包含:根据所述配置文件中client下sdk配置项,于预存的多个客户端信息中调取执行命令的对应的客户端信息;根据所述配置文件中key下commands配置项,于预存的多个命令信息中调取待执行的命令信息。

鉴于项目迭代速度快,可能在之后仍有新的命令没有被覆盖到的问题。本申请可将命令发送抽象成execute方法,不关注具体方法执行客户端和被执行方法,只用传入执行方法客户端对象,执行方法对象,以及对应参数,压测便可以进行,在未来拓展时,例如需要新加入一个客户端,那么只需要在clientMap中添加对应的客户端对象,同样地,需要新加入一个命令时,只需要在commandMap中添加对应的方法对象即可。

请参考图2所示,在本申请一实施例中,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试包含:

S201所述执行器通过execute方法根据所述调用接口调用选择器中get方法获得所述客户端信息和所述命令信息;

S202根据所述客户端信息和所述命令信息按所述线程执行数据对应的线程数通过反射的方式执行对应的redis-JavaSDK压力测试。

通过上述方式可利用execute方法将执行预定命令完成压力测试;

在上述实施例中,通过execute方法执行对应的redis-JavaSDK压力测试,便于工作人员根据实际需要适应性调整测试,其中,execute方法执行前后还可加入限流和监控环节,具体方法如下:

在本申请一实施例中,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试之前包含:根据所述配置文件获得限流阈值,根据所述限流阈值对所述执行器的测试频率进行限流。具体的,请参考图3所示,根据所述限流阈值对所述执行器的测试频率进行限流包含:

S301根据所述限流阈值通过令牌桶算法按对应速率的令牌;

S302通过令牌维持所述执行器内执行线程执行对应的redis-JavaSDK压力测试。

在实际工作中,该限流的整体思路为使用令牌桶算法,以限流的速率生成令牌,当前请求执行到限流模块时,若此时存在令牌,则消耗一块令牌,并执行之后操作,若此时不存在令牌,则该请求会休眠,等到令牌重新生成时会唤醒该请求;其在命令执行器中execute方法前,当达到限流阈值时,便会使执行线程休眠。

在本申请一实施例中,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试之后包含:统计所述执行器通过execute方法执行对应的redis-JavaSDK压力测试的测试数量获得统计结果,将统计结果提供至预定地址。

具体的,该监控策略在命令执行器中execute方法后,每一次执行命令后都会计数,并将结果发送到指定ip和端口。在实际工作中可使用Prometheus进行数据的采集,配合Grafana将数据展示。具体步骤如下:

1、使用Prometheus的JavaSDK在每一次发送命令处埋点;

2、在配置文件中填写压力测试机器的IP和端口;

3、Prometheus会将采集的数据发送到指定ip和端口,Grafana会将该数据在页面进行展示。

在本申请一实施例中,所述执行器通过execute方法执行对应的redis-JavaSDK压力测试还包含:根据所述配置文件中的key配置项和value配置项获得指定长度;采用ThreadLocalRandom来生成随机数,通过TheadLocalRandom内部Map中key存储当前线程ID,value存储当前seed;以及,利用StringBuilder来拼接字符串,且所述字符串长度小于所述指定长度时,向系统申请资源所带来消耗。

具体的,为了最大化减少外界因素对压测结果的干扰,本申请为提供性能可采用如下流程:

在执行命令时常需要生成参数,例如需要生成长度为256字符的key和value时,并且该字符串需要随机生成,保证压测时能均匀落在集群中每个节点,常常能见到使用Random这个对象来生产随机字符串,Random随机原理是根据系统时间来生成seed,根据seed生成随机数,但由于Random是线程安全的,其中的seed不能被多个线程同时共享,在高并发下会造成大量的线程竞争资源现象。本发明采用ThreadLocalRandom来生成随机数,TheadLocalRandom内部会维护一个Map,key存储当前线程ID,value存储当前seed。

使用StringBuilder来拼接字符串,且预设长度减少扩容时向系统申请资源所带来消耗。

请参考图4所示,本申请还提供一种redis-JavaSDK压力测试装置,所述装置包含配置模块、线程工厂、数据库、选择器和执行器;所述配置模块用于根据用户提供的配置参数和预存的配置项生成配置文件;所述线程工厂用于根据所述配置文件中线程参数设定对应的线程执行数据;所述数据库用于预存多个客户端信息和多种命令信息;所述选择器分别与所述线程工厂和所述数据库相连,用于根据所述配置文件中的客户端对象和命令集对象于预存的多个客户端信息和多种命令信息中获取对应的客户端信息和命令信息,并根据所述线程执行数据、所述客户端信息和所述命令信息向执行器提供对应的调用接口;所述执行器与所述选择器相连,用于根据所述调用接口调用客户端信息、命令信息和所述线程执行数据,通过execute方法执行对应的redis-JavaSDK压力测试。

进一步的,所述redis-JavaSDK压力测试装置还可包含限流中心和监控中心,各组件的功能及执行逻辑如下:

一、配置中心

程序启动开始会将配置中心中的配置项生成为全局常量,供外部调用。

二、线程工厂

线程工厂通过读取配置文件中threadCount配置项指定了同时执行命令的线程数。

三、客户端中心和命令集中心

客户端中心用于集成多种客户端并且对于每种客户端都有对应的getClient方法用于获取该客户端的Constructor对象。

命令集中心用于集成多种命令并且对于每种命令都有对应的getCommand方法用于获取该命令的Method对象。

四、选择器

1.选择器通过读取配置文件中client下sdk配置项来选取执行命令的客户端。例如图2中“sdk:0”表示此次压测选取JedisCluster作为发送命令的客户端。

2.选择器通过读取配置文件中key下commands配置项,来指定此次压测需要执行的具体命令。

3.选择器通过上述读取的配置会调用客户端中心指定的getClient方法和命令集中心的getComand方法。并向外暴露get方法用于命令执行器中调用。

五、命令执行器

命令执行器主要有execute方法,execute方法主要实现了:

1.用于调用选择器中get方法用于获取客户端对象和命令对象。

2.通过获取的客户端对象和命令对象便可以用反射的方式执行命令。

六、限流中心和监控中心

1.限流中心应用在命令执行器中execute方法前,当达到限流阈值时,便会使执行线程休眠。

2.监控中心应用在命令执行器中execute方法后,每一次执行命令后都会计数,并将结果发送到指定ip和端口。

再请参考图5所示,上述组件在应用过程中,其压测流程如下:

1、首先配置参数为:命令:set;客户端:JedisCluster;长度:key长度为256字符,value长度为256字符;限流:5w次执行命令/s;监控:127.0.0.1:6973。

2、运行程序,此时会将配置项生成为全局常量。例如:

public static final String CLIENT=“O”;//选择jedisCluster作为客户端;

public static final String COMMAND=“set”;//选择测试set命令;

public static final int KEY_LENGTH=256;//key的长度为256字符;

public static final int LIMIT=50000;//限流为5w次命令每秒;

public static final int THREAD_COUNT=100//模拟100个线程同时发送命令public static final String IP="127.0.0.1”public static final int PORT=6973;

3、线程工厂通过读取THREAD COUNT生成指定线程数量。

4、选择器读取CLIENT选择客户端对象。

5、选择器读取COMMAND选择命令集对象。

6、将命令集对象和客户端对象传入执行器。

7、执行命令前,在限流中心累加执行次数,计算每秒命令数,若超过LIMIT则休眠当前执行命令的线程。

8、使用反射方式通过客户端对象调用命令集对象。

9、在监控中心累加执行次数,累加次数发送给指定地址:IP+PORT。由服务器进行计算tps,qps后进行展示。

以上便是一个压力测试,其中789步骤会循环执行,而其他步骤只会执行一次。

本申请的有益技术效果在于:可以对支持redis命令的产品进行全方位的测试,在功能拓展性上也有良好的表现。

本申请还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法。

本申请还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述方法的计算机程序。

本申请还提供一种计算机程序产品,包括计算机程序/指令,该计算机程序/指令被处理器执行时实现上述方法的步骤。

如图6所示,该电子设备600还可以包括:通信模块110、输入单元120、音频处理单元130、显示器160、电源170。值得注意的是,电子设备600也并不是必须要包括图6中所示的所有部件;此外,电子设备600还可以包括图6中没有示出的部件,可以参考现有技术。

如图6所示,中央处理器100有时也称为控制器或操作控件,可以包括微处理器或其他处理器装置和/或逻辑装置,该中央处理器100接收输入并控制电子设备600的各个部件的操作。

其中,存储器140,例如可以是缓存器、闪存、硬驱、可移动介质、易失性存储器、非易失性存储器或其它合适装置中的一种或更多种。可储存上述与失败有关的信息,此外还可存储执行有关信息的程序。并且中央处理器100可执行该存储器140存储的该程序,以实现信息存储或处理等。

输入单元120向中央处理器100提供输入。该输入单元120例如为按键或触摸输入装置。电源170用于向电子设备600提供电力。显示器160用于进行图像和文字等显示对象的显示。该显示器例如可为LCD显示器,但并不限于此。

该存储器140可以是固态存储器,例如,只读存储器(ROM)、随机存取存储器(RAM)、SIM卡等。还可以是这样的存储器,其即使在断电时也保存信息,可被选择性地擦除且设有更多数据,该存储器的示例有时被称为EPROM等。存储器140还可以是某种其它类型的装置。存储器140包括缓冲存储器141(有时被称为缓冲器)。存储器140可以包括应用/功能存储部142,该应用/功能存储部142用于存储应用程序和功能程序或用于通过中央处理器100执行电子设备600的操作的流程。

存储器140还可以包括数据存储部(数据143),该数据存储部(数据143)用于存储数据,例如联系人、数字数据、图片、声音和/或任何其他由电子设备使用的数据。存储器140的驱动程序存储部(驱动程序144)可以包括电子设备的用于通信功能和/或用于执行电子设备的其他功能(如消息传送应用、通讯录应用等)的各种驱动程序。

通信模块110即为经由天线111发送和接收信号的发送机/接收机110。通信模块(发送机/接收机)110耦合到中央处理器100,以提供输入信号和接收输出信号,这可以和常规移动通信终端的情况相同。

基于不同的通信技术,在同一电子设备中,可以设置有多个通信模块110,如蜂窝网络模块、蓝牙模块和/或无线局域网模块等。通信模块(发送机/接收机)110还经由音频处理器130耦合到扬声器131和麦克风132,以经由扬声器131提供音频输出,并接收来自麦克风132的音频输入,从而实现通常的电信功能。音频处理器130可以包括任何合适的缓冲器、解码器、放大器等。另外,音频处理器130还耦合到中央处理器100,从而使得可以通过麦克风132能够在本机上录音,且使得可以通过扬声器131来播放本机上存储的声音。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述的具体实施例,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的具体实施例而已,并不用于限定本申请的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

技术分类

06120116232453