redis のロック分類
redis で使用できるロック コマンドは、INCR、SETNX、SET
最初のロック コマンド INCR
この種のロックの考え方は、キーが存在しない場合、最初にキーの値が 0 に初期化されるというものです。 、その後 INCR 操作が実行されます。プラス 1。
その後、他のユーザーが INCR 操作を実行して 1 を追加したときに、返された数値が 1 より大きい場合、ロックが使用されていることを意味します。
1、 客户端A请求服务器获取key的值为1表示获取了锁 2、 客户端B也去请求服务器获取key的值为2表示获取锁失败 3、 客户端A执行代码完成,删除锁 4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功 5、 客户端B执行代码完成,删除锁 $redis->incr($key); $redis->expire($key, $ttl); //设置生成时间为1秒
2 番目のタイプのロック SETNX
このロックの背後にある考え方は、キーが存在しない場合、キーを値
に設定するというものです。キーがすでに存在する場合、SETNX は何もアクションを実行しません
1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功 2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败 3、 客户端A执行代码完成,删除锁 4、 客户端B在等待一段时间后在去请求设置key的值,设置成功 5、 客户端B执行代码完成,删除锁 $redis->setNX($key, $value); $redis->expire($key, $ttl);
3 番目のロック SET
上記の 2 つの方法には問題があります。が見つかります。すべてキーの有効期限を設定する必要があります。では、なぜキーの有効期限を設定する必要があるのでしょうか?リクエストの実行が何らかの理由で予期せず終了し、ロックが作成されても削除されなかった場合、ロックは常に存在するため、今後キャッシュが更新されることはありません。したがって、予期しないイベントを防ぐためにロックに有効期限を追加する必要があります。
ただし、Expire を使用して設定することはアトミックな操作ではありません。したがって、トランザクションを通じてアトミック性も確保できるが、まだいくつか問題があるため、公式は別の課題を挙げ、バージョン2.6.12からはSETコマンド自体に有効期限を設定する機能を追加したとしている。
rree以上がRedis には何種類のロックがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。