ホームページ  >  記事  >  データベース  >  データを保存するときに Redis はロックされますか?

データを保存するときに Redis はロックされますか?

(*-*)浩
(*-*)浩オリジナル
2019-11-23 10:02:533855ブラウズ

データを保存するときに Redis はロックされますか?

#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 関連の技術記事の詳細については、

Redis データベースの使用方法のチュートリアル

列にアクセスして学習してください。

以上がデータを保存するときに Redis はロックされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。