本文介绍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}"