经历过FunTester 框架 Redis 压测预备, 下面就应该进入实践阶段了,首先呢,先分享一个对 Redis 里面不停地添加key-value
的测试用例。
基本的用例设计思路跟之前的压测是一致的,就是一个线程去执行一个任务,然后不停地去做某个事情,然后用线程池去执行多个任务,然后最终收集汇总结果。
就我自己粗浅的理解,ready 使得连接词的获取以及释放和 http 协议的连接词使用类似原理也类似就是先去获取一个连接,然后再去做一些操作,然后再去释放连接连接,最终会在连接词里面进行一个状态的管理框架都提供了默认的管理机制这里使用。
/**
* redis添加key-value性能测试用例
*/
public class RedisPerTest extends SourceCode {
public static final String host = "FunTester隐藏地址";
public static final int port = 6379;
public static RedisBase drive;
public static void main(String[] args) {
drive = new RedisBase(host, port);
drive.index = 1;
RUNUP_TIME = 0;
drive.set("fun" + StringUtil.getString(10), "FunTester", 100);
FunTester funTester = new FunTester(100);
Concurrent concurrent = new Concurrent(funTester, 400,"redis添加key-value性能测试用例");
concurrent.start();
drive.close();
}
private static class FunTester extends FixedThread {
public FunTester(int limit) {
super(null, limit, true);
}
@Override
protected void doing() throws Exception {
drive.set("fun" + StringUtil.getString(10), "FunTester", 100);
}
@Override
public ThreadBase clone() {
return new FunTester(limit);
}
}
}
同上。
INFO-> 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> redis连接池IP:106.53.152.151,端口:6379,超时设置:5000
INFO-> =========预热完成,开始测试!=========
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍ 14% ,当前QPS: 1605
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 23% ,当前QPS: 1415
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 35% ,当前QPS: 1632
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 46% ,当前QPS: 1613
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 57% ,当前QPS: 1255
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 69% ,当前QPS: 1511
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 80% ,当前QPS: 1653
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 92% ,当前QPS: 1404
INFO-> 线程:Redis测试30,执行次数:100,错误次数: 0,总耗时:25.874 s
INFO-> 线程:Redis测试11,执行次数:96,错误次数: 0,总耗时:25.888 s
INFO-> 线程:Redis测试366,执行次数:98,错误次数: 0,总耗时:25.744 s
中间省略五百行日志
INFO-> 线程:Redis测试377,执行次数:98,错误次数: 0,总耗时:26.049 s
INFO-> 线程:Redis测试71,执行次数:98,错误次数: 0,总耗时:26.21 s
INFO-> 线程:Redis测试388,执行次数:98,错误次数: 0,总耗时:26.089 s
INFO-> Redis测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 100%
INFO->
Redis测试QPS变化曲线
见下图
INFO-> 总计400个线程,共用时:26.252 s,执行总数:38,905,错误数:0,失败数:0
INFO-> 数据保存成功!文件名:/Users/oker/IdeaProjects/funtester/long/data/Redis测试021516_400
INFO->
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":267,
> ① . "failRate":0.0,
> ① . "threads":400,
> ① . "deviation":"1.08%",
> ① . "errorRate":0.0,
> ① . "executeTotal":38905,
> ① . "qps2":1481.9823251561786,
> ① . "total":38905,
> ① . "qps":1498.1273408239701,
> ① . "startTime":"2021-09-02 15:16:35",
> ① . "endTime":"2021-09-02 15:17:01",
> ① . "mark":"Redis测试021516",
> ① . "table":"eJztk8sKgkAUQPeB/3A/QMFMWvgZ0Q8IDiQ0Fk1BLXtR0Lr5jVb90Cyiz+j2wB5UWj6m4A4XdKPnnHE0KpBuNVgQit12td+swbVt6Ld6zA9SPmxUjPecBhPdTiQYNEPOPBhagvVCvw3RgJswsjjC/SiJkezBwwjO7/IcpwZcmNwfem61jrc5VGRdSi5xUpUQpSyKkjOcckgnRNEkJcc45dFuMYXSlJzjlENUcoKDlwXOc2S+5PirXU5jIjc3izh1inPd5A8FMljF6fcel43IUedj4/dmWgS/KHo8Wq//ov+8HAt/QIMKqZAK9WtQIRVSoX4NKqRCKtSvQYVUSIX6NQotPAA24o0Q"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
INFO->
Redis测试 400 thread
见下图
Process finished with exit code 0
总体来讲,还是比较简单的,下期会测试一下多操作相关性或者集合 value 的场景,还有 Redis 自增 value。在跟同行交流的时候,他们说平时工作中很难遇到直接对 Redis 进行测试的场景。但是技能的话,做一些储备还是好的。毕竟不知道什么时候就用的上了。