Redis内存型性能白皮书
更新时间:2025-09-25
本文介绍Redis内存型的性能测试结果,以及测试环境、测试工具与测试方法。
测试结果
标准版
模型 | 命令 | QPS | Average Latency | 99th Percentile Latency |
---|---|---|---|---|
模型1 | set | 475878.22 | 1.25975 | 2.14300 |
get | 779396.46 | 0.76951 | 1.06300 | |
del | 787720.22 | 0.76144 | 1.05500 | |
sadd | 725657.61 | 0.84056 | 1.15900 | |
spop | 785626.77 | 0.76345 | 1.07100 | |
hset | 468117.14 | 1.28128 | 2.07900 | |
hget | 790171.02 | 0.75900 | 1.05500 | |
hdel | 804735.67 | 0.74532 | 1.03900 | |
zadd | 307057.99 | 1.95327 | 3.91900 | |
zcard | 817477.80 | 0.73432 | 1.02300 | |
zcount | 729895.29 | 0.82175 | 1.10300 | |
zrank | 733889.06 | 0.81724 | 1.13500 | |
zscore | 732827.23 | 0.81843 | 1.13500 | |
zrem | 801698.59 | 0.74813 | 1.04700 |
集群版(8分片)
模型 | 命令 | QPS | Average Latency | 99th Percentile Latency |
---|---|---|---|---|
模型1 | set | 994655.90 | 0.60281 | 0.80700 |
get | 1112338.85 | 0.53901 | 0.78300 | |
del | 1036812.15 | 0.57839 | 0.78300 | |
sadd | 944522.11 | 0.63489 | 0.91900 | |
spop | 1395221.27 | 0.42850 | 0.73500 | |
hset | 378135.91 | 1.55999 | 2.31900 | |
hget | 1079209.81 | 0.55546 | 0.83100 | |
hdel | 1331433.57 | 0.45037 | 0.63900 | |
zadd | 263947.45 | 2.27215 | 5.18300 | |
zcard | 1391408.45 | 0.43096 | 0.59100 | |
zcount | 623524.60 | 0.96176 | 1.27900 | |
zrank | 937068.78 | 0.63992 | 0.92700 | |
zscore | 985534.43 | 0.60843 | 0.88700 | |
zrem | 1195311.69 | 0.50167 | 0.72700 |
测试指标说明:
- QPS:每秒处理的读写操作数,单位为次/秒。
- Average Latency:操作的平均延迟时间,单位为毫秒(ms)。
- 99th Percentile Latency:99%操作延迟,指99%操作的最大延迟时间,单位为毫秒(ms)。例如该指标的值为0.5毫秒,表示99%的请求可以在0.5毫秒内被处理。
测试场景
模型——基本数据结构KEY密集型测试
场景(命令):SET、GET、DEL、SADD、SPOP、HSET、HGET、HDEL、ZADD、ZCARD、ZCOUNT、ZRANK、ZSCORE、ZREM
数据大小:256bytes
测试环境
数据库
测试环境信息 | 说明 |
---|---|
可用区 | 华北 - 北京,可用区D |
实例版本 | 7.0 |
实例规格 | cache.n1.c4.large |
实例架构 | Redis内存型社区标准版,Redis内存型企业集群版(8分片) |
测试客户端
测试环境信息 | 说明 |
---|---|
可用区 | 华北 - 北京,可用区D |
部署压测工具的设备 | 实例规格: bcc.ca3.c32m64,规格信息详情可参考实例规格 |
测试工具
工具1
压测工具:测试采用Redis Labs推出的多线程压测工具memtier_benchmark
使用方法:具体使用方法请参见 memtier_benchmark 虚机配置memtier-benchmark
使用到的测试选项:
Plain Text
1./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开源项目。
使用到的测试选项:
Plain Text
1./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
测试脚本参考
- 测试前先需测试实例延时
Plain Text
1memtier_benchmark -s ${host} -p ${port} -a ${password} --command "PING" -t 1 -c 1 --test-time=30 --out-file=ping_latency.log
压测
Plain Text
1#!/bin/bash
2bench_bin="memtier_benchmark"
3thread=30
4client=20
5host="192.168.96.116"
6port=6379
7password="Cat12345"
8data_size=256
9test_time=60
10key_maximum=300
11key_prefix=""
12command=$1
13file=$2
14start_time=$(date "+%m月 %d日 %A %H:%M:%S")
15
16echo "${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}"
17
18${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}
19
20end_time=$(date "+%m月 %d日 %A %H:%M:%S")
21
22echo "${command} start: ${start_time} end: ${end_time}" >> run.log
压测命令:
Plain Text
1#!/bin/bash
2
3# 定义命令列表和对应的类型标识(按顺序)
4declare -a commands=( \
5 "set:set __key__ __data__" \
6 "get:get __key__" \
7 "del:del __key__" \
8 "sadd:sadd myset __data__" \
9 "spop:spop myset" \
10 "hset:hset mydict __key__ __data__" \
11 "hget:hget mydict __key__" \
12 "hdel:hdel mydict __key__" \
13 "zadd:zadd myzset __key__ __data__" \
14 "zcard:zcard myzset" \
15 "zcount:zcount myzset 1 __key__" \
16 "zrank:zrank myzset __data__" \
17 "zscore:zscore myzset __data__" \
18 "zrem:zrem myzset __key__" \
19)
20# 定义输出目录
21output_dir="out"
22
23# 检查目录是否存在,不存在则创建
24if [ ! -d "$output_dir" ]; then # 注意 [ ] 前后的空格,变量用双引号包裹
25 mkdir -p "$output_dir"
26 echo "目录 $output_dir 不存在,已创建。"
27else
28 echo "目录 $output_dir 已存在,无需创建。"
29fi
30
31# 顺序执行命令并保存输出到文件
32for entry in "${commands[@]}"; do
33 # 解析类型和命令
34 type=$(echo "$entry" | cut -d':' -f1)
35 command=$(echo "$entry" | cut -d':' -f2)
36
37 #output="$output_dir/${type}"
38 echo "Running command for $type: $command"
39
40 # 执行命令并保存输出
41 ./press.sh "$command" "$type"
42done
43
44# 调用之前的提取脚本,将 out 目录下的所有文件数据提取到 summary.md
45timestamp=$(date +"%Y%m%d_%H%M%S")
46output_file="summary_${timestamp}.md"
47> "$output_file"
48
49echo "| Type | Ops/sec | Avg. Latency | p50 Latency | p99 Latency | p99.9 Latency |" >> "$output_file"
50echo "|------|---------|--------------|-------------|-------------|---------------|" >> "$output_file"
51
52# 定义期望的顺序(与 commands 顺序一致)
53declare -a types=("Set" "Get" "Del" "SAdd" "Spop" "Hset" "Hget" "Hdel" "Zadd" "Zcard" "Zcount" "Zrank" "Zscore" "Zrem")
54
55# 创建一个临时文件来存储提取的数据
56temp_file=$(mktemp)
57
58# 遍历 out 目录下的所有文件
59for file in "$output_dir"/*; do
60 awk '
61 /^(Set|Get|Del|SAdd|Spop|Hset|Hget|Hdel|Zadd|Zcard|Zcount|Zrank|Zscore|Zrem)/ {
62 printf "%s|%s|%s|%s|%s|%s\n", $1, $2, $3, $4, $5, $6
63 }' "$file" >> "$temp_file"
64done
65
66# 按预定顺序处理并输出数据
67for type in "${types[@]}"; do
68 data=$(grep "^$type" "$temp_file" | head -n 1)
69 if [ -n "$data" ]; then
70 IFS='|' read -r type_name ops_sec avg_latency p50_latency p99_latency p999_latency <<< "$data"
71 printf "| %s | %s | %s | %s | %s | %s |\n" "$type_name" "$ops_sec" "$avg_latency" "$p50_latency" "$p99_latency" "$p999_latency" >> "$output_file"
72 fi
73done
74
75# 删除临时文件
76rm "$temp_file"
77
78echo "数据已提取并保存到 $output_file 文件中,可直接复制到 Markdown 文档。"