stream-node-max-bytes パラメーターを変更して、ストリーム内の各マクロノードで使用可能な最大メモリを指定できます。 また、stream-node-max-entries パラメーターを変更して、各マクロノードに保存可能な最大ストリームエントリ数を指定できます。
前提条件
ApsaraDB for Redis インスタンスのエンジンバージョンは Redis 5.0 以降です。stream-node-max-bytes パラメーターを変更して、ストリーム内の各マクロノードで使用可能な最大メモリを指定できます。 また、stream-node-max-entries パラメーターを変更して、各マクロノードに保存可能な最大ストリームエントリ数を指定できます。
Redis ストリームとマクロノードの関係
ストリームは、Redis 5.0 で導入された新しいデータ型です。 Redis ストリームは、基数ツリーで互いに接続されたデルタ圧縮マクロノードとして表されます。 各マクロノードには、複数のストリームエントリが保存されます。 このデータ構造を利用して、ランダム要素へのアクセス、特定範囲内の要素の取得、上限付きストリームの作成などを効率的に行うことができます。 このデータ構造は、メモリ使用量も最適化します。
stream-node-max-bytes パラメーターを変更して、ストリーム内の各マクロノードで使用可能な最大メモリを指定できます。 また、stream-node-max-entries パラメーターを変更して、各マクロノードに保存可能な最大ストリームエントリ数を指定できます。
- stream-node-max-entries:デフォルト値は 100 です。これは、各マクロノードに最大 100 個のストリームエントリを保存できることを示します。 有効な値は 0〜999999999999999 です。 このパラメーターを 0 に設定すると、各マクロノードに無制限の数のストリームエントリを保存できます。 マクロノードに保存されているストリームエントリの数が上限に達すると、新しいストリームエントリが新しいマクロノードに保存されます。
- stream-node-max-bytes:単位はバイトです。 デフォルト値は 4096 で、これは各マクロノードが最大 4,096 バイトのメモリを占有できることを示します。 有効な値は 0〜999999999999999 です。 このパラメーターを 0 に設定すると、各マクロノードは無制限のメモリ量を使用できます。
一般的なシナリオ
固定長メッセージキューの長さの偏差は、stream-node-max-entries パラメーターで制御できます。
アプリケーションでメッセージを永続的に保存する必要がない場合は、XADD コマンドを実行してメッセージをストリームに追加するときに MAXLEN パラメーターを使用して、ストリーム内の最大メッセージ数を指定します。 例:
XADD cappedstream MAXLEN 5000 * field value5001 // Add a message whose key is field1 and value is value5001 to cappedstream while specifying the maximum number of messages in the stream to 5,000.
ただし、最大キュー長を正確に制御する場合 (たとえば、厳密に 5000 メッセージに制限するなど)、パフォーマンスが犠牲になります。 メモリ使用量を最適化するため、Redis ストリームは、基数ツリーで互いに接続されたデルタ圧縮マクロノードとして表されます。 ApsaraDB for Redis はメッセージを削除するたびに、メッセージが存在するマクロノードを検索し、メッセージに削除済みのマークを付ける必要があります。 高スループットの ApsaraDB for Redis でメッセージが頻繁に削除、追加される場合、この処理は最適ではありません。 メッセージを頻繁に削除する必要がある場合、ApsaraDB for Redis のパフォーマンスは大幅に低下します。 したがって、XADD コマンドにチルダ (~) を追加して、概算の最大長を指定することを推奨します。 例:
XADD cappedstream MAXLEN ~ 5000 * field value1 // Add a message whose key is field1 and value is value5001 to cappedstream while specifying the maximum number of messages in the stream to approximately 5,000.
この方法では、ストリームの実際の長さは、指定された長さ以上の近似値になります。 たとえば、ストリームには 5000、5050、5060 のメッセージが含まれるとします。 5000 からの偏差は、ストリーム内のマクロノードの数と、各マクロノードに保存可能な最大メッセージ数によって異なります。 ApsaraDB for Redis は、stream-node-max-entries パラメーター (各マクロノードに保存可能な最大メッセージ数) に基づいて近似値を計算します。 ストリームに保存されているメッセージ数がこの概算値を超える場合、ApsaraDB for Redis はメッセージを削除するのではなく、最も古いメッセージが保存されているマクロノードを削除します。
つまり、stream-node-max-entries パラメーターにより、固定長メッセージキューの長さの偏差が決定されます。 偏差を減らすには、パラメーターを小さい値に設定します。