一种对Redis集群的压力测试方法、系统、存储介质及终端与流程

文档序号:26139322发布日期:2021-08-03 14:22阅读:354来源:国知局
一种对Redis集群的压力测试方法、系统、存储介质及终端与流程

本发明涉及计算机技术领域,特别涉及一种对redis集群的压力测试方法、系统、存储介质及终端。



背景技术:

随着数据存储技术的飞速发展,对大数据各组件的性能和稳定性的测试要求越来越重要,因此在对大数据组件选型的过程中进行压力测试以确定所选组件性能是否满足业务需求,是必然进行的过程。redis作为首选的内存数据库在数据缓存与存储领域被广泛应用,因此有必要对其运行时所承载的数据压力进行测试。

但是现有的压力测试工具在进行压力测试方面只是考虑了如何对redis进行压力测试,未考虑根据实际场景进行动态配置策略与测试数据。而且,现有的压力测试工具测试结果统计方面不够友好,仍需人为干预。因此现有的redis集群压测效率非常低下,并增加人工误操作的风险。

因此,如何找到一种有效的方法,实现高效redis压测为亟待解决的问题。



技术实现要素:

本申请实施例提供了一种对redis集群的压力测试方法、系统、存储介质及终端。为了对披露的实施例的一些方面有一个基本的理解,下面给出了简单的概括。该概括部分不是泛泛评述,也不是要确定关键/重要组成元素或描绘这些实施例的保护范围。其唯一目的是用简单的形式呈现一些概念,以此作为后面的详细说明的序言。

第一方面,本申请实施例提供了一种对redis集群的压力测试方法,该方法包括:

连接待测试的目标redis集群;

配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务;

针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务;

启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。

可选的,生成测试结果之后,还包括:

根据测试结果生成压力测试报告,并将压力测试报告发送至客户端进行展示。

可选的,根据测试结果生成压力测试报告,包括:

根据测试结果计算出redis集群在单元时间内的运行参数所对应的平均值、最大值以及最小值;

加载预先设定的报告模板;

定位模板中包含的多个参数关键字;

将redis集群在单元时间内的运行参数对应的标识与模板中包含的多个参数关键字进行关联;

当关联成功时,将运行参数所对应的平均值、最大值以及最小值填充至关联到的参数关键字位置处生成压力测试报告。

可选的,针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务,包括:

确定当前针对目标redis集群的压力测试场景参数;

确定采集数量;

根据压力测试场景参数与采集数量从保存车辆数据的数据中心内采集字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据;

将字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据配置到启动后的压力测试服务中。

可选的,方法还包括:

根据压力测试场景参数确定车辆最后位置计算模型以及车辆分段限速计算模型;

将车辆最后位置计算模型以及车辆分段限速计算模型配置到启动后的压力测试服务中;

生成配置模型后的压力测试服务。

可选的,配置目标redis集群的策略信息,包括:

初始化目标redis集群的配置信息;

导入预先定义的自定义热点数据集合;

配置预先设定的压力测试的指令比例;

将配置信息、自定义热点数据集合以及指令比例配置到目标redis集群中。

可选的,初始化目标redis集群的配置信息,包括:

计算目标redis集群中每个节点的主从关系与槽位关系;

根据主从关系与槽位关系从预设redis集群配置库中匹配目标redis集群对应的配置信息。

第二方面,本申请实施例提供了一种对redis集群的压力测试系统,该系统包括:

redis集群连接模块,用于连接待测试的目标redis集群;

策略信息配置模块,用于配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务;

模型配置模块,用于针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务;

测试结果生成模块,用于启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。

第三方面,本申请实施例提供一种计算机存储介质,计算机存储介质存储有多条指令,指令适于由处理器加载并执行上述的方法步骤。

第四方面,本申请实施例提供一种终端,可包括:处理器和存储器;其中,存储器存储有计算机程序,计算机程序适于由处理器加载并执行上述的方法步骤。

本申请实施例提供的技术方案可以包括以下有益效果:

在本申请实施例中,对redis集群的压力测试系统首先连接待测试的目标redis集群,再配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务,然后针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务,最后启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。由于本申请可以实现策略信息的动态配置,以及根据压测场景配置数据模型与场景模型,可以实时监测待测试redis集群运行情况,最终生成评估报告,从而有效提高了redis集群测试效率。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。

图1是本申请实施例提供的一种对redis集群的压力测试方法的流程示意图;

图2是本申请实施例提供的一种对redis集群的压力测试过程的过程示意框图;

图3是本申请实施例提供的一种对redis集群的压力测试后输出信息的监控示例图;

图4是另一种对redis集群的压力测试方法的流程示意图;

图5是本申请实施例提供的一种对redis集群的压力测试系统的系统示意图;

图6是本申请实施例提供的一种终端的结构示意图。

具体实施方式

以下描述和附图充分地示出本发明的具体实施方案,以使本领域的技术人员能够实践它们。

应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是如所附权利要求书中所详述的、本发明的一些方面相一致的系统和方法的例子。

在本发明的描述中,需要理解的是,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。此外,在本发明的描述中,除非另有说明,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。

本申请提供的技术方案中,由于本申请可以实现策略信息的动态配置,以及根据压测场景配置数据模型与场景模型,可以实时监测待测试redis集群运行情况,最终生成评估报告,从而有效提高了redis集群测试效率,下面采用示例性的实施例进行详细说明。

下面将结合附图1-附图4,对本申请实施例提供的对redis集群的压力测试方法进行详细介绍。该方法可依赖于计算机程序实现,可运行于基于冯诺依曼体系的对redis集群的压力测试系统上。该计算机程序可集成在应用中,也可作为独立的工具类应用运行。其中,本申请实施例中的对redis集群的压力测试系统可以为用户终端,包括但不限于:个人电脑、平板电脑、手持设备、车载设备、可穿戴设备、计算设备或连接到无线调制解调器的其它处理设备等。在不同的网络中用户终端可以叫做不同的名称,例如:用户设备、接入终端、用户单元、用户站、移动站、移动台、远方站、远程终端、移动设备、用户终端、终端、无线通信设备、用户代理或用户系统、蜂窝电话、无绳电话、个人数字处理(personaldigitalassistant,pda)、5g网络或未来演进网络中的终端设备等。

请参见图1,为本申请实施例提供了一种对redis集群的压力测试方法的流程示意图。如图1所示,本申请实施例的方法可以包括以下步骤:

s101,连接待测试的目标redis集群;

其中,redis(remotedictionaryserver),即远程字典服务,是一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库。redis集群是由两个以上的redis服务节点所构成的分布式数据库。

在一种可能的实现方式中,在对redis集群进行压力测试时,用户首先打开针对redis集群的压力测试系统,用户通过输入连接目标redis集群中各个redis节点的命令,压力测试系统接收命令行进行执行,当输入的命令全部执行成功后,目标redis集群连接成功。

s102,配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务;

其次,策略信息为目标redis集群进行压力测试的具体规则。

在一种可能的实现方式中,在配置策略信息时,首先初始化目标redis集群的配置信息,然后导入预先定义的自定义热点数据集合,再配置预先设定的压力测试的指令比例,最后将配置信息、自定义热点数据集合以及指令比例配置到目标redis集群中,并基于配置的策略信息启动压力测试服务。

进一步地,在进行配置信息初始化时,首先计算目标redis集群中每个节点的主从关系与槽位关系,最后根据主从关系与槽位关系从预设redis集群配置库中匹配目标redis集群对应的配置信息。

需要说明的是,针对redis集群节点、连接数、槽位、缓存数据量大小等,以不同策略进行压测,依据压测报告调整压测策略,最终得到集群承受能力极限值。

s103,针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务;

其中,基础数据模型包含:字符串数据、大key模型、list模型、hash模型(字符串数据:json或字符串格式数据集,如:key为主键id,值为{"a1":"1","a2":"2","a3":"3"};大key模型:缓存值大小超过100k数据集;list模型:缓存值按照一定顺序排列的list格式数据集;hash模型:键值对形式的hash数据集)。业务场景模型包含:车辆最后位置计算模型、车辆分段限速计算模型。

其中,车辆最后位置计算模型:模拟车辆最后位置更新业务,每30秒执行redis中14万个最后位置缓存set、get指令,如:车辆最后位置数据格式如下:

键:车辆id

值:{"经度":"116.331288","纬度":"39.897691","gps时间

":"1583028000000","gps速度":"36.5","方向":"95"}

其中,车辆分段限速计算模型:模拟车辆分段限速计算模型,每30秒执行redis中14万个车辆报警缓存hset、hget、del指令,每2分钟执行redis中14万个车辆报警缓存hset指令,如:车辆分段限速数据格式如下:

键:车辆id

值:{"报警开始经度":"116.331288","报警开始纬度":"39.897691","报警开始gps时间":"1583028000000","报警开始gps速度":"36.5","报警开始方向":"95","道路限速值":"60","报警结束时间":"1583031600000"}

在一种可能的实现方式中,在配置模型时,首先确定当前针对目标redis集群的压力测试场景参数,再确定采集数量,然后根据压力测试场景参数与采集数量从保存车辆数据的数据中心内采集字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据,其次将字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据配置到启动后的压力测试服务中,再根据压力测试场景参数确定车辆最后位置计算模型以及车辆分段限速计算模型,再将车辆最后位置计算模型以及车辆分段限速计算模型配置到启动后的压力测试服务中,最后生成配置模型后的压力测试服务。

s104,启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。

在一种可能的实现方式中,在进行数据压测时,保持压测系统数据总量与线上集群数据量一致,启动数据压测模块,通过实时统计功能查看集群健康状况:在单元时间内,当前ops总数、key数量、连接数、节点角色、使用内存、内存碎片率、阻塞客户端数量等指标,查看各指令执行数量和执行平均耗时等,可以提高redis缓存业务场景的测试覆盖率。

进一步地,在生成压力测试结果后,需要根据压力测试结果生成压力报告,并将压力测试报告发送至客户端进行展示。

具体的,在根据压力测试结果生成压力报告时,首先根据测试结果计算出redis集群在单元时间内的运行参数所对应的平均值、最大值以及最小值,再加载预先设定的报告模板,然后定位模板中包含的多个参数关键字,再将redis集群在单元时间内的运行参数对应的标识与模板中包含的多个参数关键字进行关联,最后当关联成功时,将运行参数所对应的平均值、最大值以及最小值填充至关联到的参数关键字位置处生成压力测试报告。

例如图2所示,图2是本申请提供的一种对redis集群的压力测试的过程示意框图,首先准备压测数据,压测数据的准备可从线上进行获取,通过模拟压测车辆最后位置缓存业务处理性能,配置字符串数据基础模型,配置车辆最后位置计算模型,启动压测系统,监控压测系统运行状态,运行状态例如图3所示,最终输出压测报告和集群优化改进建议。

在本申请实施例中,对redis集群的压力测试系统首先连接待测试的目标redis集群,再配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务,然后针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务,最后启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。由于本申请可以实现策略信息的动态配置,以及根据压测场景配置数据模型与场景模型,可以实时监测待测试redis集群运行情况,最终生成评估报告,从而有效提高了redis集群测试效率。

请参见图4,为本申请实施例提供了另一种对redis集群的压力测试方法的流程示意图。如图4所示,本申请实施例的方法可以包括以下步骤:

s201,连接待测试的目标redis集群;

s202,计算目标redis集群中每个节点的主从关系与槽位关系;

s203,根据主从关系与槽位关系从预设redis集群配置库中匹配目标redis集群对应的配置信息;

s204,导入预先定义的自定义热点数据集合;

s205,配置预先设定的压力测试的指令比例;

s206,将配置信息、自定义热点数据集合以及指令比例配置到目标redis集群中,并基于配置的策略信息启动压力测试服务;

s207,确定当前针对目标redis集群的压力测试场景参数;

s208,确定采集数量,根据压力测试场景参数与采集数量从保存车辆数据的数据中心内采集字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据;

s209,将字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据配置到启动后的压力测试服务中;

s210,根据压力测试场景参数确定车辆最后位置计算模型以及车辆分段限速计算模型;

s211,将车辆最后位置计算模型以及车辆分段限速计算模型配置到启动后的压力测试服务中,生成配置模型后的压力测试服务;

s212,启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果;

s213,根据测试结果生成压力测试报告,并将压力测试报告发送至客户端进行展示。

在本申请实施例中,对redis集群的压力测试系统首先连接待测试的目标redis集群,再配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务,然后针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务,最后启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。由于本申请可以实现策略信息的动态配置,以及根据压测场景配置数据模型与场景模型,可以实时监测待测试redis集群运行情况,最终生成评估报告,从而有效提高了redis集群测试效率。

下述为本发明系统实施例,可以用于执行本发明方法实施例。对于本发明系统实施例中未披露的细节,请参照本发明方法实施例。

请参见图5,其示出了本发明一个示例性实施例提供的对redis集群的压力测试系统的结构示意图。该对redis集群的压力测试系统可以通过软件、硬件或者两者的结合实现成为终端的全部或一部分。该系统1包括redis集群连接模块10、策略信息配置模块20、模型配置模块30、测试结果生成模块40。

redis集群连接模块10,用于连接待测试的目标redis集群;

策略信息配置模块20,用于配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务;

模型配置模块30,用于针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务;

测试结果生成模块40,用于启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。

需要说明的是,上述实施例提供的对redis集群的压力测试系统在执行对redis集群的压力测试方法时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的对redis集群的压力测试系统与对redis集群的压力测试方法实施例属于同一构思,其体现实现过程详见方法实施例,这里不再赘述。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

在本申请实施例中,对redis集群的压力测试系统首先连接待测试的目标redis集群,再配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务,然后针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务,最后启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。由于本申请可以实现策略信息的动态配置,以及根据压测场景配置数据模型与场景模型,可以实时监测待测试redis集群运行情况,最终生成评估报告,从而有效提高了redis集群测试效率。

本发明还提供一种计算机可读介质,其上存储有程序指令,该程序指令被处理器执行时实现上述各个方法实施例提供的对redis集群的压力测试方法。本发明还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述各个方法实施例的对redis集群的压力测试方法。

请参见图6,为本申请实施例提供了一种终端的结构示意图。如图6所示,终端1000可以包括:至少一个处理器1001,至少一个网络接口1004,用户接口1003,存储器1005,至少一个通信总线1002。

其中,通信总线1002用于实现这些组件之间的连接通信。

其中,用户接口1003可以包括显示屏(display)、摄像头(camera),可选用户接口1003还可以包括标准的有线接口、无线接口。

其中,网络接口1004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。

其中,处理器1001可以包括一个或者多个处理核心。处理器1001利用各种借口和线路连接整个电子设备1000内的各个部分,通过运行或执行存储在存储器1005内的指令、程序、代码集或指令集,以及调用存储在存储器1005内的数据,执行电子设备1000的各种功能和处理数据。可选的,处理器1001可以采用数字信号处理(digitalsignalprocessing,dsp)、现场可编程门阵列(field-programmablegatearray,fpga)、可编程逻辑阵列(programmablelogicarray,pla)中的至少一种硬件形式来实现。处理器1001可集成中央处理器(centralprocessingunit,cpu)、图像处理器(graphicsprocessingunit,gpu)和调制解调器等中的一种或几种的组合。其中,cpu主要处理操作系统、用户界面和应用程序等;gpu用于负责显示屏所需要显示的内容的渲染和绘制;调制解调器用于处理无线通信。可以理解的是,上述调制解调器也可以不集成到处理器1001中,单独通过一块芯片进行实现。

其中,存储器1005可以包括随机存储器(randomaccessmemory,ram),也可以包括只读存储器(read-onlymemory)。可选的,该存储器1005包括非瞬时性计算机可读介质(non-transitorycomputer-readablestoragemedium)。存储器1005可用于存储指令、程序、代码、代码集或指令集。存储器1005可包括存储程序区和存储数据区,其中,存储程序区可存储用于实现操作系统的指令、用于至少一个功能的指令(比如触控功能、声音播放功能、图像播放功能等)、用于实现上述各个方法实施例的指令等;存储数据区可存储上面各个方法实施例中涉及到的数据等。存储器1005可选的还可以是至少一个位于远离前述处理器1001的存储系统。如图6所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及对redis集群的压力测试应用程序。

在图6所示的终端1000中,用户接口1003主要用于为用户提供输入的接口,获取用户输入的数据;而处理器1001可以用于调用存储器1005中存储的对redis集群的压力测试应用程序,并具体执行以下操作:

连接待测试的目标redis集群;

配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务;

针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务;

启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。

在一个实施例中,处理器1001在执行生成测试结果之后时,还执行以下操作:

根据测试结果生成压力测试报告,并将压力测试报告发送至客户端进行展示。

在一个实施例中,处理器1001在执行根据测试结果生成压力测试报告时,具体执行以下操作:

根据测试结果计算出redis集群在单元时间内的运行参数所对应的平均值、最大值以及最小值;

加载预先设定的报告模板;

定位模板中包含的多个参数关键字;

将redis集群在单元时间内的运行参数对应的标识与模板中包含的多个参数关键字进行关联;

当关联成功时,将运行参数所对应的平均值、最大值以及最小值填充至关联到的参数关键字位置处生成压力测试报告。

在一个实施例中,处理器1001在执行针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务时,具体执行以下操作:

确定当前针对目标redis集群的压力测试场景参数;

确定采集数量;

根据压力测试场景参数与采集数量从保存车辆数据的数据中心内采集字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据;

将字符串类型车辆数据、键值对类型的车辆数据以及集合类型的车辆数据配置到启动后的压力测试服务中;

根据压力测试场景参数确定车辆最后位置计算模型以及车辆分段限速计算模型;

将车辆最后位置计算模型以及车辆分段限速计算模型配置到启动后的压力测试服务中;

生成配置模型后的压力测试服务。

在一个实施例中,处理器1001在执行配置目标redis集群的策略信息时,具体执行以下操作:

初始化目标redis集群的配置信息;

导入预先定义的自定义热点数据集合;

配置预先设定的压力测试的指令比例;

将配置信息、自定义热点数据集合以及指令比例配置到目标redis集群中。

在一个实施例中,处理器1001在执行配置初始化目标redis集群的配置信息时,具体执行以下操作:

计算目标redis集群中每个节点的主从关系与槽位关系;

根据主从关系与槽位关系从预设redis集群配置库中匹配目标redis集群对应的配置信息。

在本申请实施例中,对redis集群的压力测试系统首先连接待测试的目标redis集群,再配置目标redis集群的策略信息,并基于配置的策略信息启动压力测试服务,然后针对启动后的压力测试服务配置基础数据模型与业务场景模型,生成配置模型后的压力测试服务,最后启动配置模型后的压力测试服务中的数据压测子服务进行运行,并实时统计运行后生成的redis集群在单元时间内的运行参数生成测试结果。由于本申请可以实现策略信息的动态配置,以及根据压测场景配置数据模型与场景模型,可以实时监测待测试redis集群运行情况,最终生成评估报告,从而有效提高了redis集群测试效率。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,对redis集群的压力测试的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,的存储介质可为磁碟、光盘、只读存储记忆体或随机存储记忆体等。

以上所揭露的仅为本申请较佳实施例而已,当然不能以此来限定本申请之权利范围,因此依本申请权利要求所作的等同变化,仍属本申请所涵盖的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1