Redis XTRIM

Redis Xtrim



Redis ストリームの低レベルの詳細

Redis ストリームは、メモリ効率の高いストレージ メカニズムを使用して、一連の非常に効率的な読み取り操作と挿入操作を提供する追加専用のデータ構造です。内部的に、Redis ストリームは、メモリ効率の高い空間最適化ツリーである基数ツリー データ構造を使用します。

Redis ストリームは、各エントリがキーと値のペアで構成されるエントリのリストとしてデータを格納します。以下に示すように、低レベルでは、これらのエントリはマクロ ノードにパックされます。









この記事では、XTRIM コマンドを使用したスト​​リーム エントリの削除に焦点を当てていますが、上記の概念は削除操作の効率に密接に影響します。通常、Redis ストリーム エントリの削除は、エントリ レベルではなくマクロ ノード レベルで行われる場合、非常に効率的です。このメカニズムは、次のセクションで説明する XTRIM コマンドで実装されます。



XTRIM コマンド

XTRIM コマンドは、特定のしきい値に基づいてストリームのエントリを切り取るために使用されます。しきい値は、ストリームごとのエントリの最大数または古いエントリ ID にすることができます。 XTRIM コマンドは、コマンド引数としてしきい値のタイプを受け入れます。 XTRIM コマンドの構文は次のとおりです。





XTRIM stream_key MAXLEN | | ミニイド [ = | | ] しきい値_値 [ LIMIT カウント ]

stream_key : Redis ストリームのキー。

マックスレン : エントリをトリミングした後のストリームの最大長。しきい値で指定されたストリームの長さを超えるすべてのエントリが削除されます。この引数は正の整数です。



ミニイド : エントリのトリミング後に残すべき最小ストリーム ID。指定したしきい値よりも低い ID を持つすべてのエントリが削除されます。このパラメーターを指定するたびに、しきい値がストリーム ID になります。

= 演算子 : 指定すると、しきい値に基づいて正確なトリミングが実行されます。

〜演算子 : 指定すると、しきい値とマクロ ノード サイズに基づいて、ほぼ正確なトリミングが実行されます。

しきい値_値 : 引数 MAXLEN または MINID に基づくしきい値。

LIMIT カウント : 削除するエントリの最大数。

ユース ケース 01 – 最大長に基づくストリーム エントリの削除

観光会社が観光情報を追跡するために Redis ストアを維持しているとします。 Redis ストリーム データ構造は、各観光客の情報をキーと値のペアとして保存するために使用されています。時間の経過とともにストリームは成長し、最新の 1000 エントリのみを保持する予定です。そのため、ストリームの最大長は常に 1000 にする必要があることを確認しました。これを実現するために XTRIM コマンドが使用されています。

デモンストレーションのために、まず、次のように 10 個のエントリを持つストリームを作成します。挿入を実行するために XADD コマンドが使用されています。

xadd 観光情報 * ネーム ジャック カントリー イタリア 家族 5
xadd 観光情報 * ハリー・カントリー・アメリカの家族の名前 2
xadd 観光情報 * 名前 ニコミタ 国 日本 家族mems 3
xadd 観光情報 * 名前 ザカリア 国 インド 家族mems 2
xadd 観光情報 * 名前 レドモンド 国 ブラジル familymems 6
xadd 観光情報 * 名前が見つかった国日本家族mems 3
xadd 観光情報 * 名前 Maryjohn 国 アメリカ 家族の名前 2
xadd 観光情報 * 名前 リザ 国 イタリア familymems 5
xadd 観光情報 * 名前 nimshikaa 国 日本 familymems 3
xadd 観光情報 * 名前 nisha 国 イタリア familymems 5

XRANGE コマンドを使用して、次のようにストリーム Touristinfo を調べてみましょう。

xrange Touristinfo - +

出力:

予想どおり、このコマンドによって 10 個のストリーム エントリが表示されました。

デモンストレーションの目的で、最大長が 5 になるストリームをトリミングします。

xtrim ツーリストインフォ maxlen 5

XRANGE コマンドを使用して、ストリーム エントリをもう一度調べてみましょう。

予想どおり、ストリームから 5 つのエントリが削除され、その長さは 5 です。

ユース ケース 02 – ストリーム ID に基づくストリーム エントリの削除

気象会社が Redis ストリームを使用して特定の場所の気象情報を追跡する例を見てみましょう。現在、不要になった古いエントリを削除したいと考えています。以下に示すように、MINID 戦略を使用して XTRIM コマンドを使用できます。

まず、weatherinfo というストリームを作成し、次のように 5 つのエントリを追加します。

xadd 天気情報 * 温度 10 湿度 50
xadd 天気情報 * 温度 20 湿度 70
xadd 天気情報 * 温度 12 湿度 65
xadd 天気情報 * 温度 15 湿度 88
xadd 天気情報 * 温度 18 湿度 4.5

出力:

XTRIM コマンドを使用して、指定したしきい値よりも低い ID を持つエントリを削除してみましょう。

xtrim weatherinfo MINID 1660485503248 - 0

指定された最小 ID は、3 番目のエントリに関連付けられます。したがって、ID が小さい 3 番目のエントリ以降のエントリが削除されます。

出力:

= または ~ 引数を明示的に指定していないため、コマンドはデフォルトで = 演算子を使用します。したがって、両方の使用例で正確なトリミングが行われています。 ~ 演算子を明示的に指定した場合、以下に示すように、ほぼ正確なトリミングが行われます。

上の図に示すように、XTRIM コマンドは ~ 演算子と共に使用されています。長さが 100 を超えるすべてのエントリを削除するようにコマンドに要求します。XTRIM コマンドに正確なトリミングを強制するわけではないため、トリミング操作の効率に重点が置かれます。そのため、同じマクロ ノードに属する直接のエントリは削除されません。同じマクロ ノードにある次の 3 つのエントリを保持し、それらの後にあるすべてのマクロ ノードを削除します。これにより、コマンドに余分な労力を強いる正確なトリミング アプローチよりもパフォーマンスが大幅に向上します。しきい値がエントリ ID に基づいている場合も、同じ手順が実行されます。

LIMIT 引数は、指定されたストリームから削除されるエントリの数を制限します。これを使用して、パフォーマンスをもう少し向上させることができます。

結論

つまり、XTRIM コマンドは、しきい値に基づいてストリーム エントリを削除するために使用されます。しきい値のタイプは、MAXLEN および MINID コマンド引数を使用して指定されているコンテキストで変更できます。説明したように、トリミングは 2 つの方法で行うことができます。トリミング操作では、しきい値を正確な制限または近似制限と見なします。デフォルトでは、コマンドは正確なトリミングに使用される = 演算子を使用します。 ~ 演算子を使用すると、上記のセクションで説明したように、おおよそのトリミングを行うことができます。全体として、おおよそのトリミング方法と LIMIT 引数は、XTRIM コマンドのパフォーマンスを大幅に向上させるのに役立ちます。