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 パラメーターにより、固定長メッセージキューの長さの偏差が決定されます。 偏差を減らすには、パラメーターを小さい値に設定します。

ApsaraDB for Redis コンソールでのパラメーターの変更

  1. ApsaraDB for Redis コンソールにログインします。
  2. 上部のナビゲーションバーで、インスタンスが存在するリージョンを選択します。
  3. [インスタンス一覧] ページで、対象のインスタンス ID をクリックします。 または、[詳細] アイコンをクリックし、対象インスタンスの [操作] 列の [管理] を選択します。
  4. [インスタンス情報] ページの左側のナビゲーションウィンドウで [システムパラメーター] をクリックします。
    次の手順では、stream-node-max-bytes パラメーターの変更方法を説明します。
  5. 表示されるページで、stream-node-max-bytes パラメーターを見つけ、[操作] 列の [変更] をクリックします。
  6. 表示される [stream-node-max-bytes ポリシー] ダイアログボックスで、次の手順を実行します。
    1. ビジネスニーズに合わせて、stream-node-max-bytes パラメーターの値を変更します。
    2. [OK] をクリックします。