TairRoaingは、TairでのRoaringビットマップの実装です。 TairRoaringは強力で安定したコンピューティングパフォーマンスを提供し、少量のメモリしか消費せずにクエリ速度を向上させるのに役立ちます。
TairRoaringは、Roaringビットマップに基づいて次の側面で改善されます。
TairRoaringは、2レベルのインデックスと動的コンテナを使用することで、多数のシナリオでパフォーマンスとスペースの複雑さのバランスをとることができます。
TairRoaringは、単一命令、複数データ (SIMD) 、ベクトル化、およびpopcountアルゴリズムなどの最適化技術を使用して、計算効率を改善し、効率的な時間と空間の複雑さを実現します。
TairRoaringは、Tairが提供する強力なコンピューティングパフォーマンスと高い安定性を活用して、ビジネスシナリオをサポートします。
TairRoaringの詳細については、「TairRoaring」をご参照ください。
テストツール
このトピックで提供されるテストツールは、Goプログラミング言語を使用して開発されており、redis-benchmarkユーティリティで使用されるツールと似ています。 これにより、テストツールの使用と変更が容易になります。 このテストツールでは、テスト例の作成に役立つ2つのランダム値を生成し、結果をヒストグラムとして表示することもできます。 テストツールを入手するには、 TairRoaringテストツール
使用:
Usage of ./redis:
-a string Account password used to log on to the instance. Password format: <user>:<password>.
-batching int Pipeline mode. This parameter also sets the number of individual commands that each pipeline contains. The pipeline mode combines the MULTI and EXEC commands. For example, -batching 10 indicates that 10 commands exist between the MULTI and EXEC commands.
-c int Number of tests that are run. This parameter ignores the test duration (-d).
-command string Test command. You can add the __RAND__ and __RAND2__ fields to the suffix of a command or parameter. The fields take effect and become random values only when they are added to a command or parameter suffix. Default command: TR.GETBIT foo-__RAND__.
-d int Test duration. Unit: seconds. Default value: 30.
-h string Endpoint used to connect to the instance. Default value: 127.0.0.1.
-p int Number of tests that can be run concurrently. Default value: 4.
-port int Port number of the instance. Default value: 6379.
-r int Range of Random value 1. Default value: 100000000.
-r2 int Range of Random value 2. Default value: 100000000.
サンプルコマンド:
# Run the TR.SETBIT command. Set the key to a random number that is less than 100000 and the fields to random numbers that are less than 10000000.
./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のApsaraDB for Redis Enhanced Edition (Tair) DRAMベースのインスタンスです。 ネットワーク遅延は0.1ミリ秒未満です。
単一のキーのテスト
パフォーマンステスト
1つのキーに同時にデータを書き込み、1秒あたりの最大クエリ数 (QPS) 値を取得します。
読み取りコマンドテスト
以下のコマンドを実行する: TR.GETBIT、TR.GETBITS、TR.RANGE、TR.SCAN、およびTR.RANK。 サンプルコマンド:
./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.GETBIT
1
1
1 ~ 10000000
255000
0.21
TR.GETBITS
1
100
1 ~ 10000000
54000
0.97
TR. ランク
1
1
1 ~ 10000000
161000
0.24
TR. レンジ
1
100
0~100
129000
0.46
TR. スキャン
1
100
1 ~ 10000000
130000
0.38
書き込みコマンドテスト
以下のコマンド: TR.SETBIT、TR.SETBITS、TR.APPENDBITARRAY、TR.SETRANGE、およびTR.FLIPRANGEを実行する。 サンプルコマンド:
./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.SETBIT
1
1
1 ~ 10000000
145000
0.37
TR.SETBITS
1
100
1 ~ 10000000
22000
0.71
TR.SETBITS (注文)
1
100 (ビットの最大オフセット値は2 ^ 32)
1 ~ 6000
28000
0.66
TR。アペンディターレイ
1
1000 (ビットの半分の値は1です)
1 ~ 10000000
10000
0.38
TR.SETRANGE
1
-
1000
130000
0.3
TR.FLIPRANGE
1
-
1 ~ 10000000
100000
0.46
パイプラインテスト
異なるバッチサイズを使用して、パイプラインモードでのコマンドのパフォーマンスをテストします。
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)
20
10
460000
0.42
10
50
665000
0.72
6
100
660000
0.85
3
200
680000
0.79
3
500
681500
1.96
2
100
658000
2.6
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)
20
10
572700
0.34
10
50
725900
0.65
7
100
772000
0.85
7
200
788800
1.67
5
500
746000
3.1
2
100
770000
2.1
メモリテスト
TR.STATコマンドを数回実行して、キー内のビットの分布を分析します。 異なるキー容量が使用される。 サンプルコマンド:
TR.STAT foo JSON
スパースデータを含むシナリオ
疎データは、6.25% 未満の密度で疎に分布するビットを示す。 これらのシナリオでは、キーにはほとんど配列コンテナーが含まれます。 キーの容量は、式: キー容量=キー濃度 × 2バイトを使用して計算することができる。
カーディナリティ
rle-c
array-c
bitset-c
ヒープmem (バイト)
37700484
-
65536
-
75400968
75011384
-
65536
-
150022768
100403264
-
65536
-
200806528
163090592
-
65536
-
326181184
ランダムデータを含むシナリオ
これらのシナリオでは、キーにはほとんどビットセットコンテナが含まれます。 アルゴリズムロジックに従うために、アレイコンテナが4,096を超える要素を有する場合、アレイコンテナはビットセットコンテナに変換される。
カーディナリティ
rle-c
array-c
bitset-c
ヒープmem (バイト)
253104088
-
65534
2
506208102
261169659
-
63273
2263
522227634
267974804
-
35932
29604
533159296
273694253
-
6607
58929
536491922
343504134
-
0
65536
536870912
535589835
-
0
65536
536870912
連続するランダムビットを含むシナリオ
これらのシナリオでは、記憶容量はビットの分布に密接に関連している。 その結果、これらのシナリオで実行されるテストにはほとんど価値がありません。
複数のキーのテスト
書き込みテスト
データが複数のキーに同時に書き込まれるときのエンジンパフォーマンスをテストします。 TR.SETBITSは、毎回100個のランダムビットを生成する。 サンプルコマンド:
./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__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__ __RAND__" -p 20
コマンド
フィールド /範囲
QPSリファレンス値
平均レイテンシ (ms)
TR.SETBIT
1
91003
0.43
TR.SETBITS
100
15127
0.96
TR.GETBIT
1
154941
0.32
TR.GETBITS
100
40166
1.08
TR. スキャン
100
104637
0.47
TR. ランク
-
151161
0.32
ビットごとの操作のテスト
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)
AND
3
940
3.18
OR
2
595
3.45
XOR
2
551
3.61
ディフ
3
3577
0.83
NOT
1
1281
0.77
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)
AND
2
971
2.05
OR
2
609
3.27
XOR
2
572
3.48
ディフ
2
4290
0.46
NOT
2
3577
0.55
クラスターアーキテクチャのテスト方法と結果
クラスターアーキテクチャを使用する4つのDRAMベースのインスタンスのパフォーマンスをテストします。 インスタンスのシャード数が異なります。 各シャードのサイズは4 GBです。 次の項目は、インスタンスの仕様を示しています。
8 GBクラスターインスタンス (2シャード)
16 GBクラスターインスタンス (4シャード)
32 GBクラスターインスタンス (8シャード)
64 GBクラスターインスタンス (16シャード)
ネットワークの中断を防ぐには、すべてのインスタンスの帯域幅を最大2,048 Mbit/sに増やします。 インスタンスが存在するゾーンにテストで使用するクライアントをデプロイし、プロキシエンドポイントを使用してインスタンスにアクセスします。 単一のキーを含むさまざまなコマンドを実行して、インスタンスの平均QPS値を取得します。
以下のコマンドを実行する: TR.GITBIT、TR.GITBITS、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
テスト結果:
コマンド | QPS値 (2つのシャードを持つDRAMベースのクラスターインスタンス) | QPS値 (4つのシャードを持つDRAMベースのクラスターインスタンス) | QPS値 (8つのシャードを持つDRAMベースのクラスターインスタンス) | QPS値 (16個のシャードを持つDRAMベースのクラスターインスタンス) |
TR.GITBIT | 590742 | 567738 | 569610 | 555178 |
TR.GITBITS | 53900 | 91991 | 172969 | 229214 |
TR.SETBIT | 316753 | 530367 | 577406 | 558301 |
TR.SETBITS | 31917 | 57843 | 116614 | 160891 |