この記事では、主に Redis をロックするいくつかの方法を紹介し、参考と学習のために共有します。以下では多くを述べませんが、詳細な紹介を見てみましょう。
redis ロックの分類
redis で使用できるロック コマンド テーブルは、INCR、SETNX、SET
です。
最初のロック コマンド INCR
この種のロックの考え方は、キーが存在しない場合、キーの値はINCR 演算は 1 を加算します。
その後、他のユーザーが INCR 操作を実行して 1 を追加したときに、返された数値が 1 より大きい場合、ロックが使用されていることを意味します。
1. クライアント A は、ロックが取得されたことを示すキー値 1 の取得をサーバーに要求します。
2. クライアント B もサーバーにキー値 2 の取得を要求します。
3. クライアント A はコードの実行を完了し、ロックを削除します。
4. クライアント B は一定時間待機し、次のキー値を取得します。リクエストを行うときは 1 で、ロックの取得が成功したことを示します
5。クライアント B がコードを実行し、ロックを削除します
$redis->incr($key); $redis->expire($key, $ttl); //设置生成时间为1秒
2 番目のロック SETNX
このロックの背後にある考え方は、キーが存在しない場合はキーを値に設定するというものです
キーがすでに存在する場合、SETNX は何もアクションを実行しません
1. クライアント Aサーバーにキーの値を設定するように要求します。設定が成功した場合は、ロックが成功したことを意味します
2. クライアント B もサーバーにキーの値を設定するように要求します。戻りが失敗した場合は、それを意味します
#3. クライアント A はコードの実行を完了し、ロックを削除します4. クライアント B は、キー値と設定を要求する前に一定時間待機します。成功しました5。クライアント B はコードの実行を完了し、ロックを削除します$redis->setNX($key, $value); $redis->expire($key, $ttl);
3 番目のシード ロック SET
上記の 2 つの方法には問題があります。キーの有効期限を設定する必要があることがわかります。では、なぜキーの有効期限を設定する必要があるのでしょうか?リクエストの実行が何らかの理由で予期せず終了し、ロックが作成されても削除されなかった場合、ロックは常に存在するため、今後キャッシュが更新されることはありません。したがって、予期しないイベントを防ぐためにロックに有効期限を追加する必要があります。 ただし、Expire を使用して設定することはアトミックな操作ではありません。したがって、トランザクションを通じてアトミック性も確保できるが、まだいくつか問題があるため、公式は別の課題を挙げ、バージョン2.6.12からはSETコマンド自体に有効期限を設定する機能を追加したとしている。 1. クライアント A は、サーバーにキー値の設定を要求します。設定が成功すると、ロックは成功します。 2. クライアント B も、サーバーにキー値の設定を要求します。戻りが失敗した場合、ロックが失敗したことを意味します3. クライアント A はコードの実行を完了し、ロックを削除します4. クライアント B は待機後にキー値の設定を要求します5. クライアント B はコードの実行を完了し、ロック$redis->set($key, $value, array('nx', 'ex' => $ttl)); //ex表示秒を削除します。
以上がRedisをロックする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。