本文介绍Tair内存型、Redis开源版、Redis倚天版的性能测试结果,以及测试环境、测试工具与测试方法。
测试结果
对包括SET、GET等在内的十余种Redis基础命令进行性能测试并给出测试指标。
| 命令 | Tair内存型 | Redis开源版 | Redis倚天版 | ||||||
| QPS | Average Latency | 99th Percentile Latency | QPS | Average Latency | 99th Percentile Latency | QPS | Average Latency | 99th Percentile Latency | |
| SET | 282,656 | 0.45 | 0.86 | 142,376 | 0.45 | 0.72 | 126,493 | 0.50 | 1.01 | 
| GET | 519,761 | 0.24 | 0.36 | 204,690 | 0.31 | 0.47 | 201,492 | 0.31 | 0.53 | 
| ZADD | 208,169 | 0.62 | 1.14 | 113,135 | 0.57 | 0.78 | 90,046 | 0.71 | 1.44 | 
| ZSCORE | 463,904 | 0.27 | 0.40 | 170,163 | 0.37 | 0.54 | 172,508 | 0.37 | 0.68 | 
| HSET | 260,069 | 0.49 | 1.03 | 124,613 | 0.51 | 0.97 | 116,706 | 0.54 | 1.12 | 
| HGET | 494,603 | 0.25 | 0.37 | 188,903 | 0.34 | 0.52 | 175,461 | 0.36 | 0.64 | 
| LPUSH | 286,324 | 0.44 | 0.84 | 153,269 | 0.42 | 0.59 | 129,188 | 0.49 | 0.96 | 
| LINDEX | 414,070 | 0.30 | 0.45 | 157,568 | 0.40 | 0.58 | 154,444 | 0.41 | 0.76 | 
| SADD | 292,738 | 0.44 | 0.86 | 140,155 | 0.45 | 0.63 | 126,199 | 0.50 | 0.99 | 
| SISMEMBER | 531,139 | 0.24 | 0.34 | 181,492 | 0.35 | 0.52 | 211,807 | 0.30 | 0.47 | 
| EVALSHA | 214,303 | 0.60 | 1.12 | 101,136 | 0.63 | 0.91 | 76,659 | 0.84 | 2.09 | 
测试指标说明:
- QPS:每秒处理的读写操作数,单位为次/秒。 
- Average Latency:操作的平均延迟时间,单位为毫秒(ms)。 
- 99th Percentile Latency:99%操作延迟,指99%操作的最大延迟时间,单位为毫秒(ms)。例如该指标的值为0.5毫秒,表示99%的请求可以在0.5毫秒内被处理。 
- 测试结果为在多个可用区、对多个实例、进行多次测试的平均值。 
- 测试结果中的延迟为全链路延迟,包含数据包在DB侧及压测端排队的时延。 
- 测试结果受到多种不可控因素的影响,存在约10%的误差属于合理范围。 
- 测试结果仅代表新购实例进行单一命令测试的结果,而生产环境实例的压力测试请以业务压测场景为准。 
- 测试结果反映了实例的极限性能,在生产环境中,不建议将实例维持在极限负载状态。 
测试环境
数据库
| 测试环境信息 | 说明 | 
| 地域和可用区 | 华北2(北京)可用区L、华东1(杭州)可用区K、华东2(上海)可用区N、华南1(深圳)可用区C。 说明  本测试在多个地域进行,本测试报告仅代表上述可用区的平均性能水平。 | 
| 实例架构 | 标准架构(双副本),不启用集群,详情请参见标准架构。 说明  其他架构的性能说明: 
 n为集群架构的分片节点数或读写分离架构的总节点数。 | 
| 实例版本 | 本次测试兼容Redis 7.0版本,通常测试结果受版本影响较小。 | 
| 实例规格 | 本次测试以下实例规格: 
 测试结果受规格影响较小,更多关于规格的详情请参见实例规格。 | 
测试客户端
| 测试环境信息 | 说明 | 
| 部署压测工具的设备 | |
| 地域和可用区 | 与实例对应的地域及可用区。 | 
| 操作系统 | Alibaba Cloud Linux 3。 | 
| 网络 | 与Tair实例为相同专有网络(VPC),且与Tair实例通过专有网络连接。 | 
测试工具
建议优先使用Tair团队开源的resp-benchmark工具:
- SET、GET等常规测试项与redis-benchmark保持一致,在复杂测试项中采用更贴近真实业务场景的测试模式。 
- 默认启用了多线程能力,最大程度向服务端发送请求增压,避免压测客户端成为性能瓶颈。 
若使用redis-benchmark,建议Redis 7.0及以上版本(该版本优化了基准测试工具的多线程支持)。
安装方法
pip install resp-benchmark==0.1.7安装完成后,您可以执行resp-benchmark --help命令获取更详细的配置项说明,或访问其GitHub主页。
测试示例
- 每次测试时建议先清空数据库,避免已有数据存在干扰。 
- resp-benchmark在未指定连接数时会自动选择相对合适的连接数,为测得极限负载下的数据建议手动调整连接数,比如设置为128,可以通过增加参数 - -c 128实现。连接数过低时,测试压力不足,导致QPS数据偏低;连接数过高时,测试压力可能会超过DB的处理能力,数据包会在网络链路中排队较长时间,导致延迟数据偏高。因为影响因素较多,难以在下文中给出固定的连接数配置,常见的连接数设置为32、64、128、192和256,可根据实际测试情况自行调整。
以下为各命令的测试实例:
- SET - 该指标代表SET命令的性能。 - 测试SET命令,Key范围为0-10000000(表示生成的Key名称为 - key_0000000000~- key_0009999999),Value大小为64字节,测试时长20秒:- resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SET {key uniform 10000000} {value 64}"
- GET - 该指标代表GET命令的性能。 - 构造数据,Key范围为0-10000000,Value大小为64字节: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10000000 "SET {key sequence 10000000} {value 64}"
- 测试GET命令,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "GET {key uniform 10000000}"
 
- ZADD - 该指标代表ZADD命令的性能。 - 测试ZADD的写性能,Key范围为0-1000,Score范围为0-70000,每个Key最多10000个Field,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 "ZADD {key uniform 1000} {rand 70000} {key uniform 10000}"
- ZSCORE - 该指标代表ZSCORE命令的性能。 - 构造数据,Key范围为0-1000,Score范围为0-70000,每个Key最多10007个Field: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "ZADD {key sequence 1000} {rand 70000} {key sequence 10007}"
- 测试ZSCORE命令,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "ZSCORE {key uniform 1000} {key uniform 10007}"
 
- HSET - 该指标代表HSET命令的性能。 - 测试HSET命令,Key范围为0-1000,Field范围为0-10000,每个Field的Value大小为64字节,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HSET {key uniform 1000} {key uniform 10000} {value 64}"
- HGET - 该指标代表HGET命令的性能。 - 构造数据,Key范围为0-1000,每个Key包含10007个Field,每个Field的Value大小为64字节: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "HSET {key sequence 1000} {key sequence 10007} {value 64}"
- 测试HGET命令,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HGET {key uniform 1000} {key uniform 10007}"
 
- LPUSH - 该指标代表LPUSH命令的性能。 - 测试LPUSH命令,Key范围为0-1000,Value大小为64字节,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LPUSH {key uniform 1000} {value 64}"
- LINDEX - 该指标代表LINDEX命令的性能。 - 构造数据,Key范围为0-1000,每个Key包含10000条数据,数据大小为64字节: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10000000 "LPUSH {key sequence 1000} {value 64}"
- 测试LINDEX命令,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LINDEX {key uniform 1000} {rand 10000}"
 
- SADD - 该指标代表SADD命令的性能。 - 测试SADD命令,Key范围为0-1000,Value大小为64字节,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SADD {key uniform 1000} {value 64}"
- SISMEMBER - 该指标代表SISMEMBER命令的性能。 - 构造数据,Key范围为0-1000,每个Key包含10007条数据,数据大小为64字节: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 --load -c 256 -P 10 -n 10007000 "SADD {key sequence 1000} {key sequence 10007}"
- 测试SISMEMBER命令,测试时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SISMEMBER {key uniform 1000} {key uniform 10007}"
 
- EVALSHA - 该指标代表在EVALSHA中执行SET命令的性能,其中SET命令的Key范围为0-10000000,Value大小为64字节。 - 载入Lua脚本: - redis-cli -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
- 测试命令时长20秒: - resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 10000000} {value 64}"