本文基于开源Redis集群和华为云GaussDB(for Redis)集群,在X86架构下进行了性能 对比测试。本次测试具体包括测试环境、测试模型、测试步骤和测试数据,作为 GaussDB(for Redis)和开源Redis性能分析参考。
本测试场景适用于数据量小于内存的场景。
测试环境
华为云北京四环境,具体部署方式请参考实例部署拓扑图。
服务端资源配置
表4-1 服务端资源配置
名称 CPU 内存 存储
GaussDB(for
Redis) 4vCPUs 48GB 120GB
开源Redis 4vCPUs 48GB(主)
+48GB(备) 小于40GB
客户端资源配置
表4-2 客户端资源配置
名称 规格 操作系统
弹性云服务器
(ECS)两台 通用计算增强型 | c6.2xlarge.2 |
8vCPUs | 16GB CentOS 6.9 64bit
实例部署拓扑图
● GaussDB(for Redis)集群部署
图4-1 GaussDB(for Redis)集群部署图
● 开源Redis集群部署
图4-2 开源 Redis 集群部署图
测试工具
表4-3 测试工具
测试工具名称 版本 下载地址
memtier_bench
mark 1.3.0 https://github.com/RedisLabs/
memtier_benchmark
测试环境准备
步骤1 登录华为云控制台。
步骤2 在左上角服务列表中,选择“数据库 > 云数据库GaussDB NoSQL”,进入控制台信息 页面。
步骤3 创建GaussDB(for Redis)实例,具体操作请参考购买实例。
步骤4 创建开源Redis集群。
步骤5 购买测试客户端ECS,安装memtier_benchmark。
----结束
测试样例
● string类型纯写测试
执行以下命令,测试string类型纯写的性能,并为读测试预置数据。
./memtier_benchmark -s ${redis_ip} -a ${password} -p ${redis_port} -c 20 -t 4 -n 1500000 random-data randomize distinct-client-seed -d 1024 key-maximum=1500000 key-minimum=1 --ratio=1:0 --key-pattern=S:S --show-config
● string类型纯读测试
执行以下命令,测试get的性能。
./memtier_benchmark -s ${redis_ip} -a ${password} -p ${redis_port} -c 20 -t 4 -n 1500000 random-data randomize distinct-client-seed -d 1024 key-maximum=1500000 key-minimum=1 --ratio=0:1 --key-pattern=S:S --show-config
● string类型读写1:1测试
执行以下命令,测试读写1:1的性能。
./memtier_benchmark -s ${redis_ip} -a ${password} -p ${redis_port} -c 20 -t 4 -n 1500000 random-data randomize distinct-client-seed -d 1024 key-maximum=1500000 key-minimum=1 --ratio=1:1 --key-pattern=S:S --show-config
● hash类型纯写测试
执行以下命令,测试hset的性能,并为下阶段读预置数据。
./memtier_benchmark -s ${redis_ip} -a ${password} -p ${redis_port} -c 20 -t 4 -n 1500000 random-data randomize distinct-client-seed -d 1024 key-maximum=1500000 key-minimum=1 --command='hset __key__ field __data__' --command-key-pattern=S --command-ratio=1 --show-config
● hash类型纯读测试
执行以下命令,测试hget的性能。
./memtier_benchmark -s ${redis_ip} -a ${password} -p ${redis_port} -c 20 -t 4 -n 1500000 random-data randomize distinct-client-seed -d 1024 key-maximum=1500000 key-minimum=1 --command='hget __key__ field' --command-key-pattern=S --command-ratio=1 --show-config
● hash类型读写1:1测试
执行以下命令,测试读写1:1的性能。
./memtier_benchmark -s ${redis_ip} -a ${password} -p ${redis_port} -c 20 -t 4 -n 1500000 random-data randomize distinct-client-seed -d 1024 key-maximum=1500000 key-minimum=1 command='hset __key__ field __data__' command-key-pattern=S command-ratio=1 --command='hget __key__ field' --command-key-pattern=S --command-ratio=1 --show-config
说明
上述${password}为创建数据库时设置的密码,${redis_ip},${redis_port}表示数据库的连接地 址和端口号,测试使用并发数80,data_size:1024。
测试结果
● 性能测试
表4-4 GaussDB(for Redis)集群性能数据 数据库类
型
执行的操
作类型 data_siz e(byte
)
qps(count /s)
latency(
ms) p99(ms) p9999(
ms)
GaussD B(for Redis)集 群
set 1024 168245.
41 0.48 0.80 7.20 get 1024 169466.
14 0.47 0.79 5.70 set&&ge
t 1024 168127.
72 0.47 0.79 5.63 hset 1024 166739.
55 0.48 0.80 5.65 hget 1024 166503.
99 0.48 0.79 5.95 hset&&h
get 1024 167421.
87 0.47 0.79 5.43
表4-5 开源 Redis 集群性能数据 数据库类
型
执行的操
作类型 data_siz e(byte
)
qps(count /s)
latency(
ms) p99(ms) p9999(
ms)
开源Redis集 群
set 1024 140398.
84 1.67 3.30 8.55 get 1024 147784.
27 1.63 3.00 6.95
数据库类 型
执行的操
作类型 data_siz e(byte
)
qps(count /s)
latency(
ms) p99(ms) p9999(
ms)
set&&ge
t 1024 146621.
82 1.63 3.00 8.05 hset 1024 143943.
09 1.67 3.40 8.55 hget 1024 147419.
35 1.63 3.00 7.15 hset&&h
get 1024 150614.
64 1.64 3.00 8.20
通过分析上表的数据,将GaussDB(for Redis)的测试结果和开源Redis集群测试结 果进行对比,得到表4-6的对比数据。
表4-6 GaussDB(for Redis)集群与开源 Redis 集群性能数据的比 数据库类
型
执行的操
作类型 qps latency p99 p9999 GaussDB(f
or Redis) 集群/开源 Redis集群
set 1.1983 0.2887 0.2424 0.8421 get 1.1467 0.2852 0.2633 0.8201 set&&get 1.1467 0.2882 0.2617 0.6988 hset 1.1584 0.2873 0.2353 0.6608 hget 1.1295 0.2919 0.2633 0.8322 hset&&hg
et 1.1116 0.2890 0.2617 0.6616
● 大数据量写测试
进行一组数据量超过内存的写测试,开源Redis集群在耗尽内存后会报如下错误:
server xxxxxxxxx:xxxx handle error response: -OOM command not allowed when used memory >
'maxmemory’
相比之下,GaussDB(for Redis)没有任何的影响,业务正常进行,以下为 GaussDB(for Redis)在数据量超过内存时的性能结果:
表4-7 GaussDB(for Redis)数据量超过内存时的性能结果 执行的操作类
型
qps(count/s) latency
(ms) p99(ms) p9999
(ms)
set 255861.78 0.47 1.05 37.50
执行的操作类
型 qps
(count/s) latency
(ms) p99(ms) p9999
(ms)
get 276799.67 0.43 0.97 34.50 set&&get 272387.70 0.44 1.06 28.90
● 数据压缩测试
GaussDB(for Redis)提供数据压缩服务,数据存储成本更低。预置一定数据量,
查看GaussDB(for Redis)和原生Redis集群实际占用的存储空间。
以下为预置的数据量和实际占用的存储空间。
表4-8 数据压缩测试结果
数据库类型 数据类型 预置数据量
(GB) 存储占用空间
(GB)
GaussDB(for
Redis) string 1.43 0.187
hash 1.43 0.282
开源Redis string 1.43 1.96
hash 1.43 2.18
● 结论分析
上述测试结果表明GaussDB(for Redis)存在如下优势。
a. 性能优势:在相同测试条件下,GaussDB(for Redis)的QPS较开源Redis集群 提高了11%~19%,平均延迟和P99比开源Redis集群降低了70%以上,p9999 比开源Redis集群降低了15%以上。
b. 抗写优势:在数据量大于内存的写测试中,开源Redis集群因内存限制而 OOM,GaussDB(for Redis)依然可以提供不俗的性能服务。实际上,
GaussDB(for Redis)可用的存储空间是底层SSD大小决定的,相比原生Redis 集群抗写优势显著。
c. 存储优势:GaussDB(for Redis)提供了高效的数据压缩服务,数据压缩测试 结果显示,GaussDB(for Redis)占用的存储空间只有开源Redis集群的十分之 一,相当于数据存储成本降低了10倍。