#Redis にはロック メカニズムがないため、複数のユーザー接続に対する競合の問題は発生しません。
ただし、同時実行中に、接続タイムアウト、接続のブロック、接続のクローズなどのエラーが発生する可能性があります。 (推奨学習: Redis ビデオ チュートリアル )
通常、クライアント側で接続をプールできます (Redis の読み取りおよび書き込み時に同期を使用したり、内部ロックを追加したりするなど)。または、サーバー側で redis に付属するトランザクション処理コマンド setnx を使用して、ロックを実装します。
電子商取引活動では、「フラッシュ セール」販売活動がよく行われますが、このシナリオでは通常、サーバーは大量のリクエストを同時に処理する必要があります。
つまり、同時に多数の同時ユーザーが特定の製品を購入することになります。このとき、超過しないようにする必要があります。販売(ユーザーが最終的に購入した製品の数が実際の製品数を超えています)。
ここでは、redis のロック機能とロック解除機能を適用して、ダーティ データにつながる競合を避けるために、各ショッピング操作を 1 人のユーザーのみが実行できるようにする必要があります。
次に、ロックとロック解除の正しい使い方を紹介します。
setnx
redis 公式では、ロック操作には set コマンドを使用することを推奨しており、使用方法は次のとおりです。
NX — キーが存在しない場合にのみキーが設定されることを示します。 このメソッドには問題があります。ロックを取得した後にクライアントがクラッシュするか、ロックを占有し続けた場合、ロックを解放しないとデッドロックが発生し、後続のユーザーが操作用のロックを取得できなくなります。したがって、この操作にはタイムアウトを設定する必要があります。
setnxの改善点上記のメソッドの問題に対応して、expiredメソッドを使用してタイムアウトを設定します。しかし、ここで問題は解決したでしょうか? ######いいえ!ここでの有効期限切れはアトミックな操作ではないため、setnx の操作後にクライアントがクラッシュすると、この時点ではタイムアウトが正常に設定されず、ロック操作でも上記の問題が発生する原因になります。 if ($redis->set('my:lock', 1, ['NX'])) {
# todo
$redis->del('my:lock');
}
列にアクセスして学習してください。
以上がデータを保存するときに Redis はロックされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。