Redis开源版、Redis倚天版、Tair内存型性能白皮书

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

说明

本测试在多个地域进行,本测试报告仅代表上述可用区的平均性能水平。

实例架构

标准架构(双副本),不启用集群,详情请参见标准架构

说明

其他架构的性能说明:

  • 集群架构代理模式:当请求的Key分布均匀时,其性能不低于标准架构的n倍。

  • 集群架构直连模式:当请求的Key分布均匀时,其性能等于标准架构的n倍。

  • 读写分离架构:写性能略低于标准架构(因为有更多的复制流量),读性能不低于标准架构的n倍。

n为集群架构的分片节点数或读写分离架构的总节点数。

实例规格

由于测试结果受规格影响较小,本次测试以下实例规格:

  • Tair内存型8 GB(tair.rdb.8g)

  • Redis开源版8 GB(redis.shard.xlarge.ce)

  • Redis倚天版8 GB(redis.shard.xlarge.y.ee)

规格详情请参见规格查询导航

测试客户端

测试环境信息

说明

部署压测工具的设备

云服务器ECS实例,规格为ecs.g7.8xlarge,详情请参见实例规格族

地域和可用区

与实例对应的地域及可用区。

操作系统

Alibaba Cloud Linux 3。

网络

Tair实例为相同专有网络(VPC),且与Tair实例通过专有网络连接。

测试工具

使用resp-benchmark开源工具进行压测。SET、GET等常规测试项与redis-benchmark保持一致,在其余测试项中可以更有效地模拟用户真实场景,压满Tair多个线程,从而体现Tair的实际性能。

说明

您可以执行resp-benchmark --help命令获取更详细的配置项说明,或访问其GitHub主页。

安装方法

pip install resp-benchmark==0.1.7

测试示例

重要
  • 每次测试时建议先清空数据库,避免已有数据存在干扰。

  • 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命令的性能。

    1. 构造数据,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}"
    2. 测试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命令的性能。

    1. 构造数据,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}"
    2. 测试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,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命令的性能。

    1. 构造数据,Key范围为0-1000,每个Key包含10007个Field,数据大小为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}"
    2. 测试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命令的性能。

    1. 构造数据,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}"
    2. 测试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命令的性能。

    1. 构造数据,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}"
    2. 测试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字节。

    1. 载入Lua脚本:

      redis-cli -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
    2. 测试命令时长20秒:

      resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 10000000} {value 64}"