• 云数据库 Redis 性能深度评测(阿里云、华为云、腾讯云、百度智能云)


    在当今的云服务市场中,阿里云、腾讯云、华为云和百度智能云都是领先的云服务提供商,他们都提供了全套的云数据库服务,其中 Redis 属于RDS 之后第二被广泛应用的服务,本次测试旨在深入比较这四家云服务巨头在Redis云数据库性能方面的表现,为企业在选择合适的云数据库时提供重要的参考依据。我们将针对阿里云、腾讯云、华为云和百度智能云的 Redis 云数据库进行全方位的性能测试,包括读写性能、并发处理能力等方面的测试。通过这些测试,我们将对这四家云服务提供商的Redis云数据库进行客观、公正的比较,以便企业能够根据自身业务需求选择最适合的云数据库服务。通过本次测试,我们希望为企业提供一份详实的报告,以便企业在选择Redis云数据库服务时能够做出明智的决策。同时,我们也希望通过本次测试推动云服务提供商在技术和服务方面不断创新和提升,为企业提供更加优质、高效的云服务

    测试结论

    标准版评测详细数据和结论

    详细数据

    52e6fa621b913d70a531b5f3f01694f8.png

    e219989f9b400ff4c15813bb954b9d33.png

    9d6c822cf7e79920742b88e409caa64c.png

    标准版对比总结:

    f81935d172b4c842085653fce33bce71.png

    • 阿里云:整体性能排名第一,其中模型1中9/16个场景,模型3小Key读相关场景性能表现明显优于其它所有竞品

    • 百度智能云:全部29个场景中,9个场景排名第一,19个场景性能表现优于腾讯云与华为云;

    • 腾讯云:兼容Redis6.0,实际是1主1从3proxy部署架构,整体性能表现和华为差不多

    • 华为云:兼容Redis6.0, 1主1从部署,整体性能表现和腾讯差不多

    我们把测试数据加权之后,标准版的整体排名:阿里云(1.262)>百度智能云(1.053)>腾讯云(0.644)>华为云(0.537)

    集群版评测结论

    详细数据

    dc7e12edf5a8ec7a4db7e1a83ed1b547.png

    88112f86faf7de450546af9551409818.png

    407f5ef56f9d292333bc95bfd6a11c63.png

    集群版本对比结论

    8dfb016d3c60fb7928dff5bb239600d4.png

    • 阿里云:在大key场景下性能退化严重,如hgetall、zrange、模型2、模型3涉及大key操作的场景性能打不上去

    • 百度智能云:各场景性能表现都比较好,没有明显性能短板

    • 腾讯云:在模型3-4KB以下场景性能均优于华为和百度

    我们把测试数据加权之后,集群版本整体排名:华为云(1.328)>百度智能云(1.197)>腾讯云(1.124)>阿里云(0.373)

    测试环境

    厂商云服务器1台标准版8GB实例1台集群版64GB实例1台
    阿里云Tair for Redis规格族:计算型 c8y实例规格:ecs.c8y.4xlargevCPU :16 vCPU内存:32 GiB处理器主频/睿频:2.75 GHz/-内网带宽:最高 16 Gbps付费模式:按量付费商品类型:Tair for Redis存储介质:内存可用区类型:单可用区实例类型:高可用版本兼容性:Redis 6.0架构类型:不启用集群读写分离:关闭分片规格:8GB副本数:2副本付费模式:按量付费商品类型:Tair for Redis存储介质:内存可用区类型:单可用区实例类型:高可用版本兼容性:Redis 6.0架构类型:启用集群连接模式:代理模式分片规格:8GB副本数:2副本分片数量:8
    腾讯云云数据库 Redis规格族:计算型C6实例规格:C6.4XLARGE32vCPU :16 vCPU内存:32 GiB处理器主频/睿频:Intel Ice Lake(3.2GHz/3.5Ghz)内网带宽:最高 18 Gbps计费模式:按量付费产品版本:内存版兼容版本:6.2架构版本:标准架构内存容量:8GB副本数量:1个(1主1副本)计费模式:按量付费产品版本:内存版兼容版本:6.2架构版本:集群架构分片数量:8片分片容量:8GB副本数量:1个(1主1副本)
    华为云分布式缓存服务Redis版规格族:通用计算增强型c6s实例规格:c6s.4xlarge.2vCPU :16 vCPU内存:32 GiB处理器主频/睿频:Intel Cascade Lake 2.6GHz内网带宽:最高 7.5 Gbps计费模式:按需计费缓存类型:Redis版本号:6.0实例类型:主备CPU架构:x86计算副本数:2实例规格:redis.ha.xu1.large.r2.8(8GB)计费模式:按需计费缓存类型:Redis版本号:5.0实例类型:Proxy集群CPU架构:x86计算规格选择模式:自定义分片单分片容量:8GB实例规格:redis.proxy.xu1.large.s8.64(64GB)
    百度智能云云数据库 SCS规格族:计算型C5实例规格:bcc.c5.c16m32vCPU :16 vCPU内存:32 GiB处理器主频/睿频:Intel Xeon Platinum 8350C-2.6GHz内网带宽:最高 6 Gbps计费模式:后付费引擎类型:Redis版本类型:社区版架构类型:标准版引擎版本:6.0存储类型:高性能内存型节点规格:cache.n1.large副本数量:2计费模式:后付费引擎类型:Redis版本类型:企业版架构类型:集群版引擎版本:6.0存储类型:高性能内存型节点规格:cache.n1.large分片数量:8片副本数量:2

    测试工具

    工具1:

    压测工具:测试采用Redis Labs推出的多线程压测工具memtier_benchmark

    使用方法:具体使用方法请参见 memtier_benchmark 虚机配置memtier-benchmark

    使用到的测试选项:

    ./memtier_benchmark  -s *** -a *** -p 8635 -c 4 -t 30 -n 1000000 --random-data --randomize --distinct-client-seed -d 128 --key-maximum=50331648 --key-minimum=1 --key-prefix= --ratio=1:0 --out-file=./result/result_small_128_set.log

    工具2:

    压测工具:开源Redis的redis-benchmark工具进行压测,它是Redis官方的性能测试工具

    使用方法:为了确保工具支持--thread参数,测试时候使用最新的Redis版本进行编译,参见Redis开源项目

    使用到的测试选项:

    ./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com -p 6379 -a testaccount:Rp829dlwa -n 3000000 -r 10000000  -c 256 -t set -d 64 --threads 16

    测试指标

    • OPS:每秒执行的读写操作数,单位为次/秒。

    评测模型

    测试模型1——基本数据结构KEY密集型测试

    workload模型

    workload模型编号测试模型参数设置
    --commandSpecify a command to send in quotes.--command="${command}"
    --test-timeNumber of seconds to run the test--test-time=300
    数据模型

    数据模型编号数据模型参数设置
    value length-256随机生成value,256字节-d 256

    测试模型2——KEY分散读写测试

    workload模型

    workload模型编号测试模型参数设置
    100% Write100%写操作(string set)--ratio=1:0
    100% Read100%读操作(string get)--ratio=0:1
    50% Read+50% Write50%读操作(string get)+ 50%写操作(string set)--ratio=1:1
    数据模型

    数据模型编号数据模型参数设置
    value length随机生成value,数据大小在指定的范围之内–data-size-range=1-10240

    测试模型3——不同写入数据大小测试

    workload模型

    workload模型编号测试模型参数设置
    -t测试命令,包含SET, GET-t "${command}"
    -nTotal number of requests (default 100000)-n 3000000
    数据模型

    数据模型编号数据模型参数设置
    value length-256value长度分别为16、128、256、1024、4096字节-d ${value_length}

    备注:模型3测试场景和工具参考阿里tair实例内存型(兼容Redis6.0)性能白皮书,需要使用redis-benchmark对SET、GET命令进行不同写入数据大小场景的测试,并给出测试指标

    测试方法

    购买Redis实例,默认开启AOF和RDB,在云服务器上通过测试工具并发连接实例进行打压

    模型1测试方法

    固定参数:

    1. bench_bin="memtier_benchmark"
    2. thread=50
    3. client=20
    4. host="192.168.96.31"
    5. port=6379
    6. password="1234qwer"
    7. data_size=256
    8. test_time=300
    9. key_maximum=300
    10. key_prefix=""
    11. command=$1
    12. file=$2
    13. start_time=$(date | awk '{print$4}')
    14. echo "${bench_bin} -t ${thread} -c ${client} -s ${host} -p ${port} -a ${password} --distinct-client-seed --command="${command}" --key-prefix="${key_prefix}" --key-minimum=1 --key-maximum=${key_maximum} --random-data --data-size=${data_size} --test-time=${test_time} --out-file=out/${file}"
    15. ${bench_bin} -t ${thread} -c ${client} -s ${host} -p ${port} -a ${password} --distinct-client-seed --command="${command}" --key-prefix="${key_prefix}" --key-minimum=1 --key-maximum=${key_maximum} --random-data --data-size=${data_size} --test-time=${test_time} --out-file=out/${file}
    16. end_time=$(date|awk '{print$4}')
    17. echo "${command} start: ${start_time} end: ${end_time}" >> run.log

    压测命令:

    1. sh press.sh "set __key__ __data__" set
    2. sh press.sh "get __key__" get
    3. sh press.sh "del __key__" del
    4. sh press.sh "hset __key__ __key__ __data__" hset
    5. sh press.sh "hmset __key__ __key__ __data__ __key__ __data__ __key__ __data__" hmset
    6. sh press.sh "hget __key__ __key__" hget
    7. sh press.sh "hmget __key__ __key__ __key__" hmget
    8. sh press.sh "hgetall __key__" hgetall
    9. sh press.sh "hdel __key__ __key__" hdel
    10. sh press.sh "zadd __key__ __key__ __data__" zadd
    11. sh press.sh "zcard __key__" zcard
    12. sh press.sh "zcount __key__ 1 __key__" zcount
    13. sh press.sh "ZRANGE __key__ 0 __key__ WITHSCORES" zrange
    14. sh press.sh "zrank __key__ __data__" zrank
    15. sh press.sh "zscore __key__ __data__" zscore
    16. sh press.sh "zrem __key__ __key__" zrem

    模型2测试方法

    以8GB标准版为例,模型的性能指标的测试方法如下所示:

    • 测试场景1:100% Write模型通过执行如下命令,设置value长度为1-10240字节内的随机大小,记录性能指标。

    • 测试场景2:100% Read模型通过执行如下命令,在写入的数据中均匀随机读取长度为1-10240字节的数据,记录性能指标。

    • 测试场景3:50% Read+50% Write模型通过执行如下命令,记录性能指标。

    1. host=$1
    2. port=$2
    3. passwd=$3
    4. max_key=500000
    5. start_time=$(date | awk '{print$4}')
    6. ./memtier_benchmark -s ${host} -a ${passwd} -p ${port} -c 20 -t 50 --random-data --randomize --distinct-client-seed --data-size-range=1-10240 --key-maximum=${max_key} --key-minimum=1 --key-prefix= --ratio=1:0 --test-time=300 --out-file=out/${host}_${port}_set.log
    7. end_time=$(date|awk '{print$4}')
    8. echo "100% write start: ${start_time} end: ${end_time}" >> run.log
    9. start_time=$(date | awk '{print$4}')
    10. ./memtier_benchmark -s ${host} -a ${passwd} -p ${port} -c 20 -t 50 --random-data --randomize --distinct-client-seed --data-size-range=1-10240 --key-maximum=${max_key} --key-minimum=1 --key-prefix= --ratio=0:1 --test-time=300 --out-file=out/${host}_${port}_get.log
    11. end_time=$(date|awk '{print$4}')
    12. echo "100% read start: ${start_time} end: ${end_time}" >> run.log
    13. start_time=$(date | awk '{print$4}')
    14. ./memtier_benchmark -s ${host} -a ${passwd} -p ${port} -c 20 -t 50 --random-data --randomize --distinct-client-seed --data-size-range=1-10240 --key-maximum=${max_key} --key-minimum=1 --key-prefix= --ratio=1:1 --test-time=300 --out-file=out/${host}_${port}_set_get.log
    15. end_time=$(date|awk '{print$4}')
    16. echo "50% write + 50% read start: ${start_time} end: ${end_time}" >> run.log

    模型3测试方法

    使用开源的redis-benchmark工具进行压测,它是Redis官方的性能测试工具,为确保redis-benchmark工具支持--threads参数,测试时推荐使用最新的Redis版本进行编译。

    压测命令:

    1. host=$1
    2. port=$2
    3. passwd=$3
    4. key_range=1000000
    5. #16
    6. echo "before 16: redis-cli -h ${host} -p ${port} -a ${passwd} flushall"
    7. redis-cli -h ${host} -p ${port} -a ${passwd} flushall
    8. sleep 10
    9. start_time=$(date | awk '{print$4}')
    10. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t set -d 16 --threads 16 > out/16_set
    11. end_time=$(date|awk '{print$4}')
    12. echo "16 bytes_SET start: ${start_time} end: ${end_time}" >> run.log
    13. start_time=$(date | awk '{print$4}')
    14. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t get -d 16 --threads 16 > out/16_get
    15. end_time=$(date|awk '{print$4}')
    16. echo "16 bytes_GET start: ${start_time} end: ${end_time}" >> run.log
    17. #128
    18. echo "before 128: redis-cli -h ${host} -p ${port} -a ${passwd} flushall"
    19. redis-cli -h ${host} -p ${port} -a ${passwd} flushall
    20. sleep 10
    21. start_time=$(date | awk '{print$4}')
    22. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t set -d 128 --threads 16 > out/128_set
    23. end_time=$(date|awk '{print$4}')
    24. echo "128 bytes_SET start: ${start_time} end: ${end_time}" >> run.log
    25. start_time=$(date | awk '{print$4}')
    26. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t get -d 128 --threads 16 > out/128_get
    27. end_time=$(date|awk '{print$4}')
    28. echo "128 bytes_GET start: ${start_time} end: ${end_time}" >> run.log
    29. #256
    30. echo "before 256: redis-cli -h ${host} -p ${port} -a ${passwd} flushall"
    31. redis-cli -h ${host} -p ${port} -a ${passwd} flushall
    32. sleep 10
    33. start_time=$(date | awk '{print$4}')
    34. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t set -d 256 --threads 16 > out/256_set
    35. end_time=$(date|awk '{print$4}')
    36. echo "256 bytes_SET start: ${start_time} end: ${end_time}" >> run.log
    37. start_time=$(date | awk '{print$4}')
    38. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t get -d 256 --threads 16 > out/256_get
    39. end_time=$(date|awk '{print$4}')
    40. echo "256 bytes_GET start: ${start_time} end: ${end_time}" >> run.log
    41. #1024
    42. echo "before 1024: redis-cli -h ${host} -p ${port} -a ${passwd} flushall"
    43. redis-cli -h ${host} -p ${port} -a ${passwd} flushall
    44. sleep 10
    45. start_time=$(date | awk '{print$4}')
    46. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t set -d 1024 --threads 16 > out/1024_set
    47. end_time=$(date|awk '{print$4}')
    48. echo "1024 bytes_SET start: ${start_time} end: ${end_time}" >> run.log
    49. start_time=$(date | awk '{print$4}')
    50. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t get -d 1024 --threads 16 > out/1024_get
    51. end_time=$(date|awk '{print$4}')
    52. echo "1024 bytes_GET start: ${start_time} end: ${end_time}" >> run.log
    53. #4096
    54. echo "before 4096: redis-cli -h ${host} -p ${port} -a ${passwd} flushall"
    55. redis-cli -h ${host} -p ${port} -a ${passwd} flushall
    56. sleep 10
    57. start_time=$(date | awk '{print$4}')
    58. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t set -d 4096 --threads 16 > out/4096_set
    59. end_time=$(date|awk '{print$4}')
    60. echo "4096 bytes_SET start: ${start_time} end: ${end_time}" >> run.log
    61. start_time=$(date | awk '{print$4}')
    62. ./redis-benchmark -h ${host} -p ${port} -a ${passwd} -n 3000000 -r ${key_range} -c 256 -t get -d 4096 --threads 16 > out/4096_get
    63. end_time=$(date|awk '{print$4}')
    64. echo "4096 bytes_GET start: ${start_time} end: ${end_time}" >> run.log

    总体结论和分析

    综合性能排名:百度智能云>腾讯云>华为云>阿里云

    • 百度智能云标准版本和集群版本都排名第二,综合性能表现优于所有竞品,总体第一名,腾讯综合排名第二;

    • 通过测试我们发现阿里和华为长板特长,短板也特短,尤其是阿里云大key场景存在性能问题,尤其集群版拉低整体评分,排名第四

    • 华为排名第三。

    希望本次的测试可以给大家提供选型参考。当能云厂商更新也很快,性能上也是你追我赶,后面我们会持续关注各个云厂商的性能变化,动态更新测试结果。

  • 相关阅读:
    数据结构与算法-图
    怎么修复老照片?给你推荐这几个修复方法
    提升测试工具开发的思考
    抽象类和接口
    三篇论文入选国际顶会SIGMOD,厉害了腾讯云数据库
    音视频流媒体之 IJKPlayer FFmpeg Android 编译
    10 关联模型《ThinkPHP6 入门到电商实战》
    【算法自由之路】归并、快排
    了解防抖和节流:提升前端交互体验的实用策略
    (数字图像处理MATLAB+Python)第十章图像分割-第四,五节:分水岭分割和综合案例
  • 原文地址:https://blog.csdn.net/zNZQhb07Nr/article/details/136327369