これを行うには少なくとも3つの異なる方法があり、それぞれに長所と短所があります。
最初のアプローチは、ツリーの非アトミックアドホックスキャンを使用して、ツリーの第2レベル(カスタマイズの第1セット)を識別して無効化(削除)することです。これを行うには、ハッシュのフィールドに階層的な命名スキームを使用し、HSCAN
を使用してそれらを反復処理します。 。たとえば、ハッシュのキー名が製品のID(ProductAなど)であるとすると、最初のカスタマイズの最初のバージョンのフィールド名として「0001:0001」、2番目のバージョンのフィールド名として「0001:0002」、など。同様に、「0002:0001」は2番目のカスタマイズの1番目のバージョンなどになります。次に、カスタマイズ42のすべてのバージョンを検索し、HSCAN ProductA 0 MATCH 0042:*
を使用します。 、HDEL
応答のフィールドを入力し、カーソルがゼロになるまで繰り返します。
反対のアプローチは、各カスタマイズのバージョンをプロアクティブに「インデックス付け」して、ハッシュのフルスキャンを実行する代わりにそれらを効率的にフェッチできるようにすることです。そのための方法は、Redisのセットを使用することです。特定の製品のバージョンのすべてのフィールド名を含むセットを保持します。バージョンは、(私の例のように)シーケンシャルにすることも、一意である限り他のバージョンにすることもできます。コストはこれらのインデックスを維持することです-製品のカスタマイズやバージョンを追加または削除するときはいつでも、これらのセットとの一貫性を維持する必要があります。たとえば、バージョンの作成は次のようになります。
HSET ProductA 0001:0001 "<customization 1 version 1 JSON payload"
SADD ProductA:0001 0001
これらの2つの操作は、単一のトランザクションで行う必要があることに注意してください(つまり、MULTI\EXEC
を使用します ブロックまたはEVAL
Luaスクリプト)。これを設定した場合、カスタマイズを無効にするには、SMEMBERS
を呼び出すだけです。 関連するセットで、その中のバージョンをハッシュ(およびセット自体)から削除します。ただし、大きなセットからすべてのメンバーを読み取るには時間がかかる可能性があることに注意してください。1Kのメンバーはそれほど悪くはありませんが、大きなセットにはSSCAN
があります。 。
最後に、ハッシュの代わりにソート済みセットを使用することを検討できます。このユースケースではおそらく直感的ではありませんが、並べ替えられたセットを使用すると、必要なすべての操作を実行できます。ただし、これを使用するための代償は、ハッシュのO(1)と比較して、追加/削除/読み取りのO(logN)の複雑さが増すことですが、数値を考えると、違いは重要ではありません。
ソートされたセットの力を解き放つには、辞書式順序を使用して、ソートされたセットのすべてのメンバーが同じスコアを持つようにします(たとえば、0を使用します)。各製品は、ハッシュと同様に、並べ替えられたセットで表されます。セットのメンバーは、ハッシュのフィールド、つまりカスタマイズのバージョンに相当します。 「トリック」とは、範囲検索(またはレベル2の無効化)を実行できるようにメンバーを構築することです。これがどのように見えるかの例です(ここで重要なProductAはハッシュではなくソートされたセットであることに注意してください):
ZADD ProductA 0 0001:0001:<JSON>
カスタマイズバージョンを読み取るには、ZRANGEBYLEX ProductA [0001:0001: [0001:0001:\xff
返信からJSONを分割し、カスタマイズ全体を削除するには、ZREMRANGEBYLEX
を使用します 。