すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):TairRoaring パフォーマンスホワイトペーパー

最終更新日:Mar 29, 2026

TairRoaring は、Alibaba Cloud Tair が実装した Roaring ビットマップデータ構造です。この実装では、以下の 3 つの最適化を組み合わせることで、低メモリ使用量を実現しつつ高いクエリスループットを提供します。

  • 2 段階インデックスおよび動的コンテナ — 広範なデータ分布にわたって、パフォーマンスと空間計算量のバランスを最適化します。

  • 単一命令複数データ (SIMD)、ベクトル化、およびポップカウントアルゴリズム — 時間計算量および空間計算量の両方における計算効率を向上させます。

  • Tair のストレージエンジン — 実稼働ワークロードに求められる計算性能および安定性を提供します。

コマンドの完全なリファレンスについては、「TairRoaring」をご参照ください。

テスト環境

本ドキュメント内のすべてのベンチマークは、16 GB Tair (Enterprise Edition) DRAM ベースのインスタンスに対して実行されます。クライアントとインスタンス間のネットワーク遅延は 0.1 ms 未満です。

クラスターアーキテクチャのテストでは、DRAM ベースのクラスターインスタンスを 4 台使用し、各シャードのサイズは 4 GB です。

インスタンスシャード数
8 GB2
16 GB4
32 GB8
64 GB16

クライアントは、インスタンスと同じゾーンに配置され、プロキシエンドポイント経由で接続されます。すべてのインスタンスは、テスト中のネットワーク飽和を防ぐため、最大帯域幅を 2,048 Mbit/s に設定されています。

本ドキュメント全体で示す QPS 値は、特定のテスト条件で測定された参考値です。実際のパフォーマンスは、ご利用のインスタンス仕様、データ分布、キー数、ネットワーク環境、およびコマンドの混合比率によって異なります。

テストツール

ダウンロード先:redis-benchmark.tar.gz

このツールは Go 言語で記述されており、redis-benchmark ユーティリティと同様の設計を採用しています。使いやすく、カスタマイズも容易です。各リクエストごとに 2 つの独立したランダム値(__RAND__ および __RAND2__)を生成し、結果をヒストグラム形式で出力します。

パラメーター:

パラメーターデフォルト値説明
-h127.0.0.1インスタンスエンドポイント
-port6379インスタンスポート
-a<user>:<password> 形式のパスワード
-d30テスト持続時間(秒)
-cリクエスト総数。設定すると -d をオーバーライドします。
-p4同時接続数
-r100000000__RAND__
-r2100000000__RAND2__
-commandTR.GETBIT foo-__RAND__実行するコマンド。コマンドまたはパラメーターの末尾に __RAND__ または __RAND2__ を付加することで、ランダム値を生成できます。
-batchingパイプラインのバッチサイズ。コマンドを MULTI/EXEC でラップします。

例:

# TR.SETBIT を 20 の同時接続で 30 秒間実行します。
# キー:foo-0 ~ foo-99999、ビットオフセット:0 ~ 9999999。
./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.SETBIT foo-__RAND__ bar-__RAND2__" \
  -p 20 \
  -c 1

標準アーキテクチャのベンチマーク

このセクションのすべてのテストは、単一の 16 GB 標準アーキテクチャインスタンスを使用します。

単一キーのテスト

読み取りコマンド

各テストは、事前にデータが挿入済みの単一キーに対して 20 の同時接続で実行されます。

サンプルコマンド:

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.GETBIT foo-__RAND__ bar-__RAND2__" \
  -p 20 \
  -c 1

結果:

コマンドリクエストあたりのレコード数パラメーター範囲QPS平均レイテンシー(ms)
TR.GETBIT11–10000000255,0000.21
TR.GETBITS1001–1000000054,0000.97
TR.RANK11–10000000161,0000.24
TR.RANGE1000–100129,0000.46
TR.SCAN1001–10000000130,0000.38

コマンドの記述

サンプルコマンド:

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.SETBIT foo-__RAND__ bar-__RAND2__" \
  -p 20 \
  -c 1

結果:

コマンドリクエストあたりのレコード数パラメーター範囲QPS平均レイテンシー(ms)
TR.SETBIT11–10000000145,0000.37
TR.SETBITS1001–1000000022,0000.71
TR.SETBITS(順序付き)100(最大オフセット 2^32)1–600028,0000.66
TR.APPENDBITARRAY1000(半分のビットが 1)1–1000000010,0000.38
TR.SETRANGE1000130,0000.30
TR.FLIPRANGE1–10000000100,0000.46

パイプラインテスト

パイプラインモードでは、MULTI と EXEC の間に複数のコマンドをグループ化することで、1 リクエストあたりのレイテンシーが増加する代わりにスループットを向上させます。

TR.SETBIT パイプライン

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 10000000 \
  -command "TR.SETBIT foo-__RAND__ 1" \
  -batching 10 \
  -p 20 \
  -c 1
同時接続数バッチサイズビット/秒平均レイテンシー(ms)
2010460,0000.42
1050665,0000.72
6100660,0000.85
3200680,0000.79
3500681,5001.96
2100658,0002.60
TairRoaring性能测试-3

TR.GETBIT パイプライン

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.GETBIT foo-__RAND__ __RAND2__" \
  -batching 10 \
  -p 20 \
  -c 1
foo-__RAND__ キーが存在しない場合、空のキーとして扱われます。このテストを実行する前に、キーを事前に登録してください。
同時接続数バッチサイズビット/秒平均レイテンシー(ms)
2010572,7000.34
1050725,9000.65
7100772,0000.85
7200788,8001.67
5500746,0003.10
2100770,0002.10
TairRoaring性能发布-4

メモリ使用量

キーのコンテナ分布を確認するには、TR.STAT foo JSON を実行します。TairRoaring では、配列コンテナ、ビットセットコンテナ、RLE(ランレングスエンコーディング)コンテナの 3 種類のコンテナにデータを格納し、データ分布に基づいて最も省スペースなタイプを選択します。

配列コンテナは、要素数が 4,096 を超えると自動的にビットセットコンテナに変換されます。

疎なデータ(ビット密度 < 6.25%)

疎なキーは主に配列コンテナを使用します。メモリ使用量は線形に増加し、キー容量 = カーディナリティ × 2 バイト となります。

カーディナリティRLE コンテナ配列コンテナビットセットコンテナヒープメモリ(バイト)
37,700,48465,53675,400,968
75,011,38465,536150,022,768
100,403,26465,536200,806,528
163,090,59265,536326,181,184

ランダムなデータ

カーディナリティが増加すると、配列コンテナはビットセットコンテナに変換されます。すべてのコンテナがビットセットコンテナとなった時点で、ヒープメモリは 536,870,912 バイトで安定します。

カーディナリティRLE コンテナ配列コンテナビットセットコンテナヒープメモリ(バイト)
253,104,08865,5342506,208,102
261,169,65963,2732,263522,227,634
267,974,80435,93229,604533,159,296
273,694,2536,60758,929536,491,922
343,504,134065,536536,870,912
535,589,835065,536536,870,912

連続するビット

連続するビットの分布におけるメモリ使用量は、特定のビットパターンに強く依存し、ばらつきが大きくなります。これらの結果は、一般的な計画目的には代表的ではありません。

複数キーのテスト

書き込みおよび読み取りコマンド

TR.SETBITS は 1 回の呼び出しで 100 個のランダムビットを書き込みます。各テストは、100,000 個の異なるキーに対して 20 の同時接続で実行されます。

サンプルコマンド:

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 10000000 \
  -r2 100000 \
  -command "TR.SETBITS foo-__RAND2__ __RAND__ __RAND__ ...(100 回)" \
  -p 20
コマンドリクエストあたりのレコード数QPS平均レイテンシー(ms)
TR.SETBIT191,0030.43
TR.SETBITS10015,1270.96
TR.GETBIT1154,9410.32
TR.GETBITS10040,1661.08
TR.SCAN100104,6370.47
TR.RANK151,1610.32
TairRoaring性能测试-5

ビットごとの演算

TR.BITOP

TR.BITOP は、複数のキーに対してビットごとの演算を実行し、その結果を新しいキーに保存します。サポートされる演算は、AND、OR、NOT、DIFF、XOR です。

サンプルコマンド:

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.BITOP dest-__RAND__ AND foo-__RAND__ foo-__RAND__" \
  -p 3 \
  -c 1
操作同時接続数QPS平均レイテンシー(ms)
AND39403.18
OR25953.45
XOR25513.61
DIFF33,5770.83
NOT11,2810.77
TairRoaring性能测试-7
TR.BITOPCARD

TR.BITOPCARD は、複数のキーに対してビットごとの演算を実行し、結果のキーを保存せずに、ビットが 1 に設定されている数を返します。サポートされる演算は、AND、OR、NOT、DIFF、XOR です。

サンプルコマンド:

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.BITOPCARD AND foo-__RAND__ foo-__RAND__" \
  -p 2 \
  -c 1
操作同時接続数QPS平均レイテンシー(ms)
AND29712.05
OR26093.27
XOR25723.48
DIFF24,2900.46
NOT23,5770.55
TairRoaring性能测试-8

クラスタアーキテクチャのベンチマーク

これらのテストは、4 台の DRAM ベースクラスターインスタンスにわたる水平スケーリングを測定します。各テストは、20 の同時接続で単一キーのコマンドを実行します。対象となるコマンドは、TR.GETBIT、TR.GETBITS、TR.SETBIT、および TR.SETBITS です。

サンプルコマンド:

./redis -h r-**********0d7f.redis.zhangbei.rds.aliyuncs.com \
  -a user:password \
  -d 30 \
  -r 100000 \
  -r2 10000000 \
  -command "TR.SETBIT foo-__RAND__ bar-__RAND2__" \
  -p 20 \
  -c 1

結果:

コマンド2 シャード(8 GB)4 シャード(16 GB)8 シャード(32 GB)16 シャード(64 GB)
TR.GETBIT590,742567,738569,610555,178
TR.GETBITS53,90091,991172,969229,214
TR.SETBIT316,753530,367577,406558,301
TR.SETBITS31,91757,843116,614160,891
TairRoaring性能测试-9

TR.GETBIT の QPS は、シャード数にかかわらずほぼ一定です。これは、単一ビットの読み取り操作が 2 シャード時点で既にシャード単位の処理能力を飽和させるためです。一方、TR.GETBITS および TR.SETBITS は、マルチレコードリクエストがプロキシを介してシャード間で処理を分散するため、シャード数にほぼ比例してスケールします。