Redis は分散ロックを実装します
1. lockKey 領域に従って setnx を実行します (セットが存在しません。キー値が空の場合は通常どおり設定して 1 を返します。それ以外の場合は、設定されていない場合は 0 を返します) 設定が成功した場合はロックが取得されたことを意味し、そうでない場合はロックが取得されていないことを意味します。
2. ロックが取得できない場合は、Redis に移動して、キーに対応する値を取得します。タイムスタンプ (ミリ秒、t1 で表される) をキーに保存します。デッドロックや他のクライアントが一定時間 (5 秒) を超えてロックを占有することを避けるために、クライアントの現在のタイムスタンプが使用され、保存されているタイムスタンプと比較されます。 (推奨学習: Redis ビデオ チュートリアル )
3. キーの使用時間制限を超えていない場合は、false を返し、他の人がキーを占有していて強制できないことを示します。制限時間を超えた場合は、ロックを解除し、タイムスタンプを使用してこのフィールドの値を置き換えることができます。
4. ただし、setnx が失敗しても get 値が取得できない場合は、操作前にロックが解除されているため、setnx メソッドを再実行して取得するのが最善の方法です。その値はロックを取得するために使用されます。
ロックの解放: redis のキーの削除
Zookeeper は分散ロックを実装します
一時的な順次ノードに基づいて:
1. お客様最後に、create() メソッドを呼び出して、「locknode/guid-lock-」という名前のノードを作成します。ここでのノードの作成タイプは EPHEMERAL_SEQUENTIAL に設定する必要があることに注意してください。
2. クライアントは getChildren("locknode") メソッドを呼び出して、作成されたすべての子ノードを取得します。
3. クライアントがすべての子ノードのパスを取得した後、ステップ 1 で作成したノードのシーケンス番号がすべてのノードの中で最も小さいことが判明した場合、クライアントはロックを取得したとみなされます。
4. 作成したノードのシーケンス番号が全ノードの中で最小でない場合は、作成したノードよりもシーケンス番号が小さい最大のノードが監視されて待機します。次回監視対象の子ノードが変更されるまでの間、再度子ノードを取得してロックを取得するかどうかを決定します。
ロックを解放するプロセスは比較的簡単で、作成した子ノードを削除するだけです。
#違い:
#redis 分散ロック、実際には、常に自分でロックを取得しようとする必要があるため、より多くのパフォーマンスが消費されますzk 分散ロックでは、ロックを取得できない場合はリスナーを登録するだけで、常に積極的にロックの取得を試みる必要がなく、パフォーマンスのオーバーヘッドが小さい
#もう 1 つの点は、redis の場合、ロックを取得するクライアントにバグがあるかハングアップした場合、ロックはタイムアウト期間を待った後にのみ解放できることです; zk の場合は、一時的な znode が作成されるため、次のようになります。クライアントがハングアップすると、znode は失われ、この時点で自動的に解放されます。Lock
Redis 関連の技術記事の詳細については、Redis データベースの使用方法のチュートリアルを参照してください。
学べるコラム!以上がzk 分散ロックと redis 分散ロックの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。