redis のロック分類
redis で使用できるロック コマンドは、INCR、SETNX、SET です。
1. 最初のロック コマンド INCR
この種のロックの考え方は、キーが存在しない場合、キーの値は 0 に初期化されるということです。まず、それを追加するために INCR 操作が実行されます。
その後、他のユーザーが 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. 2 番目のロック SETNX
このロックの背後にある考え方は、キーが存在しない場合はキーを value に設定するというものです。
キーがすでに存在する場合、SETNX は何もアクションを実行しません
1. クライアント A がサーバーに要求しますキーの値を設定します。設定が成功した場合は、ロックが成功したことを意味します。
2. クライアント B もサーバーにキーの値を設定するように要求します。返されなかった場合は、ロックが解除されたことを意味しますfailed
3. クライアント A はコードの実行を完了し、ロックを削除します
4. クライアント 一定時間待機した後、クライアント B がキー値の設定を要求し、設定は成功します。
5. クライアント B はコードの実行を完了し、ロックを削除します
$redis->setNX($key, $value); $redis->expire($key, $ttl);
3. 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 関連の知識の詳細については、Redis の使用法チュートリアルをご覧ください。 ### カラム!
以上がRedisをロックする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。