このホワイトペーパーでは、Tair メモリ最適化、Tair 永続メモリ最適化、および Redis オープンソース版のインスタンスにおけるピークスループットとレイテンシーのベンチマークに加え、結果を再現するために必要なテスト環境、ツール、およびコマンドについて説明します。
テスト結果
これらの数値は、新規インスタンスに対して単一コマンドのテストを実施した場合のピークパフォーマンスを示しています。複数回の実行結果を、複数のゾーンで平均化したものです。約 10% の誤差は通常の範囲です。本番環境では、インスタンスをピーク負荷で実行しないでください。正確なサイジングのためには、独自のワークロードでテストを実施してください。
次の表は、一般的な Redis コマンド 11 種類の QPS とレイテンシーの測定値を示しています。
コマンド | Tair メモリ最適化 | Redis オープンソース版 | Tair 永続メモリ最適化 | ||||||
QPS | 平均レイテンシー | 99 パーセンタイルレイテンシー | QPS | 平均レイテンシー | 99 パーセンタイルレイテンシー | QPS | 平均レイテンシー | 99 パーセンタイルレイテンシー | |
SET | 282,656 | 0.45 | 0.86 | 142,376 | 0.45 | 0.72 | 135,247 | 0.93 | 1.50 |
GET | 519,761 | 0.24 | 0.36 | 204,690 | 0.31 | 0.47 | 208,960 | 0.61 | 0.90 |
ZADD | 208,169 | 0.62 | 1.14 | 113,135 | 0.57 | 0.78 | 96,007 | 1.29 | 1.90 |
ZSCORE | 463,904 | 0.27 | 0.40 | 170,163 | 0.37 | 0.54 | 154,693 | 0.82 | 1.00 |
HSET | 260,069 | 0.49 | 1.03 | 124,613 | 0.51 | 0.97 | 68,565 | 1.81 | 3.80 |
HGET | 494,603 | 0.25 | 0.37 | 188,903 | 0.34 | 0.52 | 180,050 | 0.70 | 0.91 |
LPUSH | 286,324 | 0.44 | 0.84 | 153,269 | 0.42 | 0.59 | 143,951 | 0.87 | 1.20 |
LINDEX | 414,070 | 0.30 | 0.45 | 157,568 | 0.40 | 0.58 | 62,112 | 2.01 | 2.80 |
SADD | 292,738 | 0.44 | 0.86 | 140,155 | 0.45 | 0.63 | 138,710 | 0.90 | 1.20 |
SISMEMBER | 531,139 | 0.24 | 0.34 | 181,492 | 0.35 | 0.52 | 162,585 | 0.78 | 0.99 |
EVALSHA | 214,303 | 0.60 | 1.12 | 101,136 | 0.63 | 0.91 | 89,726 | 1.38 | 2.10 |

メトリクスの定義:
QPS (Queries Per Second): 1 秒あたりに処理される読み取りおよび書き込み操作の数。
平均レイテンシー:操作の平均レイテンシー (ms)。
99 パーセンタイルレイテンシー: 99% の操作が完了するレイテンシーの上限 (ms)。たとえば 0.5 ms は、リクエストの 99% が 0.5 ms 以内に完了することを意味します。
レイテンシーは、データベースとストレステストクライアント両方のキューイング時間を含め、エンドツーエンドで測定します。
99 パーセンタイルレイテンシーのスパイクは、データ構造のエンコーディング遷移によって発生する場合があります。特に、空のインスタンスに初めて書き込む場合に発生しやすくなります。
他のアーキテクチャにおけるパフォーマンススケーリング
上の表は、標準アーキテクチャ (デュアルレプリカ) を対象としています。他のアーキテクチャでは、標準ベースラインから次のルールに従ってスケールします。ここで n は、クラスターアーキテクチャでのシャード数、または読み書き分離アーキテクチャでのノード総数です。
アーキテクチャ | QPS のスケーリングルール |
クラスター (プロキシモード) | >= n x 標準アーキテクチャの QPS (キーが均等に分散している場合) |
クラスター (直接接続モード) | = n x 標準アーキテクチャの QPS (キーが均等に分散している場合) |
読み書き分離 | 書き込み: レプリケーションのトラフィックが増えるため、標準よりわずかに低下します。読み取り: >= n x 標準アーキテクチャの QPS |
テスト環境
データベース
パラメーター | 値 |
リージョンとゾーン | 中国 (北京) ゾーン L、中国 (杭州) ゾーン K、中国 (上海) ゾーン N、中国 (深セン) ゾーン C |
インスタンスアーキテクチャ | 標準アーキテクチャ (デュアルレプリカ)、クラスター無効 |
インスタンスバージョン | Redis 7.0 |
インスタンスタイプ | Tair メモリ最適化 8 GB ( |
バージョンがテスト結果に与える影響はほとんどありません。
詳細については、「標準アーキテクチャ」および「インスタンスタイプとよくある質問」をご参照ください。
テストクライアント
パラメーター | 値 |
インスタンスタイプ | Elastic Compute Service (ECS) |
リージョンとゾーン | データベースインスタンスと同一 |
オペレーティングシステム | Alibaba Cloud Linux 3 |
ネットワーク | Tair インスタンスと同一の Virtual Private Cloud (VPC) |
テストツール
すべてのテストでは、Tair チームのオープンソースツール、resp-benchmark を使用します。
一般的なコマンド (SET、GET) の動作は、 redis-benchmark と一致します。
複雑なコマンドについては、実際のワークロードをより忠実にシミュレートするテストモードを使用します。
サーバーへのリクエストの負荷を最大化し、クライアントがボトルネックになるのを防ぐため、デフォルトでマルチスレッドモードが有効になっています。
resp-benchmark のインストール:
pip install resp-benchmark==0.1.7インストール後、resp-benchmark --help を実行すると、設定オプションの完全なリストが表示されます。
代わりに redis-benchmark を使用する場合は、マルチスレッドのサポートが最適化されている Redis 7.0 以降を使用してください。
テストの実行
事前準備
既存のデータによる干渉を避けるため、各テストの前にデータベースをクリアします。
接続数の調整
接続数 (-c) は、結果に直接影響を与えます:
接続数が少なすぎる場合:サーバーへの負荷が不十分となり、ピーク容量を反映しない低い QPS になります。
接続数が多すぎる場合:サーバーの処理能力を超え、データパケットがネットワークリンクでキューイングされ、レイテンシーが増加します。
-c 128 から開始し、結果に基づいて調整します。一般的な値は 32、64、128、192、および 256 です。-c を省略すると、resp-benchmark は値を自動的に選択します。
テストコマンド
SET
SET コマンドのパフォーマンスをテストします。キー範囲:0~10,000,000。値のサイズ:64 バイト。テスト期間:20 秒。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SET {key uniform 10000000} {value 64}"GET
GET コマンドのパフォーマンスをテストします。値のサイズ:64 バイト。テスト期間:20 秒。
テストデータをロードします。キー範囲:0~10,000,000。
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 テストを実行します。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "GET {key uniform 10000000}"
ZADD
ZADD コマンドの書き込みパフォーマンスをテストします。キー範囲:0~1,000。スコア範囲:0~70,000。キーあたり最大 10,000 メンバー。テスト期間:20 秒。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "ZADD {key uniform 1000} {rand 70000} {key uniform 10000}"ZSCORE
ZSCORE コマンドのパフォーマンスをテストします。テスト期間:20 秒。
テストデータをロードします。キー範囲:0~1,000。キーあたり 10,007 メンバー。
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 テストを実行します。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "ZSCORE {key uniform 1000} {key uniform 10007}"
HSET
HSET コマンドのパフォーマンスをテストします。キー範囲:0~1,000。フィールド範囲:0~10,000。値のサイズ: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 コマンドのパフォーマンスをテストします。テスト期間:20 秒。
テストデータをロードします。キー範囲:0~1,000。キーあたり 10,007 フィールド。値のサイズ: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 テストを実行します。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "HGET {key uniform 1000} {key uniform 10007}"
LPUSH
LPUSH コマンドのパフォーマンスをテストします。キー範囲:0~1,000。値のサイズ:64 バイト。テスト期間:20 秒。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LPUSH {key uniform 1000} {value 64}"LINDEX
LINDEX コマンドのパフォーマンスをテストします。テスト期間:20 秒。
テストデータをロードします。キー範囲:0~1,000。キーあたり 10,000 要素。値のサイズ: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 テストを実行します。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "LINDEX {key uniform 1000} {rand 10000}"
SADD
SADD コマンドのパフォーマンスをテストします。キー範囲:0~1,000。値のサイズ:64 バイト。テスト期間:20 秒。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SADD {key uniform 1000} {value 64}"SISMEMBER
SISMEMBER コマンドのパフォーマンスをテストします。テスト期間:20 秒。
テストデータをロードします。キー範囲:0~1,000。キーあたり 10,007 メンバー。
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 テストを実行します。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "SISMEMBER {key uniform 1000} {key uniform 10007}"
EVALSHA
Lua スクリプト経由で実行する SET コマンドのパフォーマンスをテストします。キー範囲:0~10,000,000。値のサイズ:64 バイト。テスト期間:20 秒。
Lua スクリプトをロードします。
redis-cli -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"前の手順で返された SHA1 ダイジェストを使用して、EVALSHA テストを実行します。
resp-benchmark -h r-bp1u****8qyvemv2em.redis.rds.aliyuncs.com -p 6379 -s 20 "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 10000000} {value 64}"