1

私はオンラインで集中的に調べましたが、この機能を提供する成熟した Redis クライアントを見つけることができませんでした。このプロジェクトのみが見つかりました。上記を提供するRedisクライアントを知っている人はいますか? ありがとうございました。

4

1 に答える 1

6

Redis クラスター内のトランザクションは、Redis スタンドアロンでのトランザクションとは別の話です。

TL;DR;

これは、クライアントの問題というよりも、保証とトレードオフに関する概念的な問題です。

説明

Redis クラスターでは、特定のノードが 1 つ以上のハッシュ スロットのマスターです。これは、複数のノード間でデータを分割するためのパーティショニング スキームです。コマンドで使用されるキーから計算された 1 つのハッシュスロットは、1 つのノードに存在します。複数のキーを持つコマンドは、同じハッシュ スロットを生成するように制限されています。それ以外の場合、それらは拒否されます。このようなコンスタレーションはクロススロットと呼ばれます。

トランザクションはクロススロット キーへのコマンドを実行するためのソリューションのように見えますが、ある時点で、あるノードのスコープを離れ、トランザクションを続行するには別のノードが必要になります。これは、1 つのキーが 1 つのノードに存在し、もう 1 つのキーが別のノードに存在する場合に発生する可能性があります。トランザクションの調整はまだ行われておらず、Redis クラスターの問題の原因となることがあります。

Redis クラスターのトランザクション サポートを提供する高レベル API は複数の問題に直面しており、これまでのところ、Redis クラスターでトランザクションを処理する方法の 2 つの戦略があります。

すべてのキーが 1 つのノードにある場合は、トランザクションをサポートします

このオプションにより、完全な機能を備えたトランザクションが可能になります。クライアント ライブラリは、トランザクションが実行されるノードを追跡し、トランザクションの進行中はスロット範囲外のキーを禁止する必要があります。スロットはキーを含むコマンドを使用してのみ決定できるため、クライアントはトランザクション フラグを設定する必要があり、キーを含む最初のコマンドでは、トランザクション内の最初のコマンドの直前に MULTI コマンドを発行する必要があります。ここでの制限は、すべてのキーを 1 つのノードに配置する必要があることです。

分散トランザクション

この場合、分散トランザクションに参加するすべてのノードで複数のトランザクションが開始されます。この分散トランザクションには、すべてのマスター ノードからのキーを含めることができます。トランザクションが実行されると、クライアント ライブラリはトランザクションの実行をトリガーし、ライブラリは (コマンド結果の順序を維持するために) すべての結果を収集し、呼び出し元に返します。

このスタイルのトランザクションは、クライアントに対して透過的です。特定のノードのキーが要求され、そのノードがまだトランザクションの一部ではない場合MULTI、ノードをトランザクションに参加させるコマンドが発行されます。ここでの欠点は、トランザクションを条件付きにすることができなくなったことです ( WATCH)。個々のトランザクションは、別のノードでキーが変更されたかどうかを認識していないため、1 つのトランザクションがロールバックされ、他のトランザクションが成功する可能性があります。2 フェーズ コミットのように聞こえます。

結論

Redis トランザクションは、条件付きにすることができるアトミック コマンド バッチ処理のように感じます。コマンドの発行時ではなく、トランザクションの実行時に読み取り結果が返されるため、コマンドの実行は延期されることに注意してください。

Redis クラスターの場合、クライアントはグローバル戦略を決定していません。特定の Redis クラスター ノードでトランザクションを実行しても安全ですが、そのノードによって提供されるキーに制限されます。考えられる両方の戦略には、特定のユースケースに役立つ可能性のあるプロパティがありますが、制限もあります。

于 2017-02-07T13:52:46.857 に答える