分散ロックは実装がとても簡単です

分散ロックは実装がとても簡単です

[[404863]]

この記事はWeChatの公開アカウント「Java Geek Technology」から転載したもので、著者はYaxue Fansです。この記事を転載する場合は、Java Geek Technology の公開アカウントにお問い合わせください。

Ah Fen は最近 Redis に魅了されています。なぜ? Redis は確かに非常に強力だと感じます。メモリベースのキー値ストレージデータベースには、実は非常に多くの機能があります。 Ah Fen さんも、Redis の使い方を本格的に学びたいと考えています。結局、面接の際、Redis は非常に良いプラスポイントであると言えます。

分散ロック

分散ロックはなぜ必要なのでしょうか?

現在、多くの大規模プロジェクトはすべて分散ベースであり、分散シナリオにおけるデータの一貫性の問題は常に無視できない問題となっています。分配に関するCAP理論をご存知ですか?

CAP 理論によれば、分散システムは一貫性、可用性、および分断耐性を同時に満たすことはできず、最大でもそのうちの 2 つしか満たすことができません。

私たちのシステムは、最終的には常に最終的な一貫性を満たしますが、この最終的な一貫性のために、分散トランザクションについて質問する人もいれば、分散ロックに焦点を当てる人もいます。

分散ロックの種類

  • 分散ロックのデータベース実装
  • 分散ロックを実装するためのキャッシュ
  • Zookeeperは分散ロックを実装する

しかし、Ah Fen は分散ロックを実装するためにキャッシュを使用することを選択しました。これは、私たちのプロジェクトで最も一般的に使用されている Redis です。 Redis は、次のようなさまざまな場所で使用できます。

  • セッションキャッシュ
  • メッセージキュー
  • 分散ロック
  • メッセージの公開と購読
  • 商品リスト、レビューリスト

今日は、Redis を使用して分散ロックを実装し、その使い方を学びます。

準備

1. Jedis jar パッケージを使用する準備をし、jar パッケージをプロジェクトにインポートします。

  1. <! --ジェディス-->  
  2. <依存関係>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>ジェダイ</artifactId>
  5. <バージョン>2.9.0</バージョン>
  6. </依存関係>

ツールクラスを直接書いてみよう

  1. パブリッククラスRedisPoolUtil {
  2.  
  3. プライベート静的最終文字列 LOCK_SUCCESS = "OK" ;
  4. プライベート静的最終文字列 SET_IF_NOT_EXIST = "NX" ;
  5. プライベート静的最終文字列 SET_WITH_EXPIRE_TIME = "PX" ;
  6.  
  7. プライベート RedisPoolUtil(){}
  8. /**
  9. *
  10. * @param ジェディス
  11. * @param lockKey ロック
  12. * @param requestId リクエストフラグ
  13. * @param expireTime タイムアウト
  14. * @戻る 
  15. */
  16. 公共 静的ブール型 tryGetDistributedLock(Jedis jedis、String lockKey、String requestId、 int expireTime) {
  17.  
  18. 文字列結果 = jedis.set (lockKey、requestId、SET_IF_NOT_EXIST、SET_WITH_EXPIRE_TIME、expireTime);
  19.  
  20. if (LOCK_SUCCESS.equals(結果)) {
  21. 戻る 真実;
  22. }それ以外{
  23. 試す{
  24. スレッド.sleep(10); // 100ミリ秒スリープ
  25. }catch(例外 e){
  26. e.printStackTrace();
  27. }
  28. }
  29. 戻る 間違い;
  30. }
  31. }

jedis.set(lockKey、requestId、SET_IF_NOT_EXIST、SET_WITH_EXPIRE_TIME、expireTime);このロック姿勢こそが最も理解する必要があるもので、そうでなければ使い方が分からないでしょう。

key: ロック キーは、実際には一意のフラグに相当します。異なるフラグを使用して、異なるビジネスをロックできます。

requestId: これは実際にデバイスをロックするために使用されるリクエストを識別するために使用されます。分散ロックでは、ロックとロック解除は同じクライアントによって実行されなければならないということを知っておく必要があります。

もう 1 つの典型的なケースは、B が A のロックを解除し、解除の混乱が生じるというものです。同じリクエストを追加しない場合は、スレッド A がビジネスを処理し、ロックを実行します。ロックは 5 秒後に期限切れになり、スレッド B はロックを取得しようとします。 A が 5 秒以上ビジネスを処理すると、A はロックの解除を開始しますが、B はこの時点でロックを検出しないため、ロックします。 A が対応する業務の処理を終了していない場合、処理を終了した後にロックを解除すると、B が追加したロックがそのまま解除されるか、ロックがまったく解除されなくなります。

SET_IF_NOT_EXIST: 名前が示すように、キーが存在しない場合は、Set 操作を実行します。存在する場合は何もせず、ロックも行いません。

SET_WITH_EXPIRE_TIME: 期限切れにするかどうか

expireTime: キーの有効期限を設定します。あなたのビジネスがロックされ、後続のビジネスがそれをロックしたい場合、ロックを保持したまま期限が切れた後にロックを解除しないと、問題が発生します。

上記のメソッドでは、tryGetDistributedLock が通常使用するロック メソッドです。

ロック解除

  1. 公共 静的ブール型 releaseDistributedLock(Jedis jedis、String lockKey、String requestId) {
  2.  
  3. 文字列スクリプト = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" ;
  4. オブジェクト結果 = jedis.eval(script、Collections.singletonList(lockKey)、Collections.singletonList(requestId));
  5.  
  6. if ( "OK" .equals(結果)) {
  7. 戻る 真実;
  8. }
  9. 戻る 間違い;
  10.  
  11. }

このスクリプトを見ると、少し奇妙に感じるかもしれません。実はこれは Lua スクリプトであり、Lua スクリプトの意味は比較的単純です。

  1. まずロックに対応する値を取得し、それがrequestIdと等しいかどうかを確認します。
  2. 等しい場合はロックを解除します(ロック解除)
  3. eval() メソッドを実行する

実はこのとき、del で削除できないのかと言う人もいます。試してみてください。このように書くと、リーダーがあなたの足を折るでしょう。

最初にロックの所有者を判別せずにロックを解除するこの方法では、どのクライアントでもいつでもロックを解除できるようになります。つまり、ロックを追加しなくても、開けることができるのです。これはどのように機能するのでしょうか?

ここでは簡単なコードを示しますが、プロジェクト内で直接使用することもできます。

  1. 試す{
  2. ブール値の結果 = RedisPoolUtil.tryGetDistributedLock(jedis, "xxxxx" , uuid, 5000);
  3.  
  4. if(結果) {
  5. xxxx コード スニペット
  6. }それ以外{
  7.  
  8. }
  9.  
  10. }キャッチ(){
  11.  
  12. }ついに{
  13. RedisPoolUtil.releaseDistributedLock(jedis, "xxxxx" , uuid);
  14. }

分散ロックの要件

相互排他性を満たす。つまり、一度にロックを保持できるのは 1 つのクライアントのみであり、複数のクライアントがロックを保持できるわけではありません。

デッドロックは発生しません。つまり、分散ロックを実装する場合、ロックが解除されていないと他のクライアントがロックできないとは言えません。他のクライアントのロックに影響を与えないようにする必要があります。

ロックとロック解除は同じクライアントが行う必要があります

分散CAP定理

まずはこの方法を実践してみて、その後、皆さんが一番知りたがらない理論的な知識についてお話しします。結局のところ、この理論的な知識は面接でよく聞かれるものです。

分散CAP理論:

カリフォルニア大学バークレー校のエリック・ブリューワー教授は、ACM PODC カンファレンスで CAP 予想を提唱しました。 2年後、MITのセス・ギルバートとナンシー・リンチがCAPを理論的に証明しました。その後、CAP 理論は分散コンピューティングの分野で正式に認められた定理となりました。

つまり、20年前、CAP理論は単なる推測に過ぎなかったのです。その結果は2年後に確認されたので、人々が流通を考えるときに考える根拠ができて、もはや単なる空想ではなくなりました。

分散CAP定理とは何ですか?

分散システムは、一貫性、可用性、パーティション耐性の 3 つの要件のうち、最大でも 2 つしか満たすことができません。

これは (Atomicity) とは異なります。CAP 理論の A とデータベース トランザクションの A は同じだが、単語が異なるため、どうして同じになるのでしょうか。

可用性: 分散の A は可用性を表し、サービスが常に利用可能であり、応答時間が正常であることを意味します。

分散システムを構築するときは、各ノードが安定していることを確認する必要があります。そうしないと、可用性が保証されず、分散型とは言えません。擬似分散型としか言いようがありません。

一貫性

つまり、更新操作が成功してクライアントに返された後、すべてのノードのデータは同時に完全に一貫しています。 Redis を使用してデータを表示する場合、多くの面接官から「データベースとキャッシュの一貫性をどのように確保しますか?」と質問されるでしょう。

結局、読むだけなら問題ないのですが、更新となると、まずデータベースに書き込んでからキャッシュを削除するかどうかです。または、最初にキャッシュを削除してからデータベースに書き込むと、データの不整合が発生する可能性があります。

したがって、これに興味がある場合は、たとえば次のことを勉強することができます。

  1. 遅延二重削除戦略
  2. 遅延読み込みは二重削除+TTL期限切れによって実現できる
  3. アクティブロード

面接中にこれらすべてを面接官に明確に説明できれば、少なくとも自分の給与要件を満たすことができるはずです。

パーティション耐性: パーティション耐性

分散システムでノードまたはネットワークのパーティション障害が発生した場合でも、一貫性と可用性を満たすサービスを提供し続けることができます。

実際、CAP 理論では、一貫性、可用性、分断耐性の 3 つの特性を同時に満たすことはできないため、いくつかのトレードオフを行う必要があります。

Redis 分散ロックの使い方を学びましたか?

<<:  世界のインターネットの半分を麻痺させたこのエッジ クラウド コンピューティング企業とは誰でしょうか?

>>:  Kubernetes はテクノロジー業界の競争条件を平等にする

推薦する

クラウドとAIの時代にはどんなストレージが必要なのでしょうか?

デジタル化の波が全国に広がり、伝統的な生産や生活様式を覆しつつある。結果として生じる新しい経済と新し...

Thanos のクイックスタート: 高可用性 Prometheus

何千ものサービスとアプリケーションが複数のインフラストラクチャに展開されている世界では、高可用性環境...

ウェブサイト運営について知っておくべきこと

インターネットの台頭と電子商取引の発展に伴い、多くの企業が電子商取引の仲間入りを果たしました。電子商...

CN2 GIA - 特別オファー、ベータ版、今後の「家宝」になるかもしれない

BandwagonHostはロサンゼルスデータセンターに新しいVPS、CN2 GIA超高レベル最適化...

hostsailor-$14/年/256MB RAM/15GB HDD/256GB トラフィック/ルーマニア/オランダ/Windows

Hostsailor の 40% オフ VPS プロモーションは 1 週間前から実施されていますが、...

おすすめ: HostHatch - 新年 35% オフ VPS 割引

HostHatch の新年プロモーション第一弾、お見逃しなく! 35% オフの割引コード: ITIS...

快手、新たな成長の柱を模索するため初のクラウドコンピューティングサービス「StreamLake」を開始

快手は最近、「顧客とユーザーを最もよく理解するクラウドサービス」をスローガンに掲げ、初のクラウドサー...

Baidu ホームページにウェブサイトのキーワードを掲載する方法

ウェブサイトのキーワードを Baidu のホームページに載せる方法は、すべての SEO 担当者が知り...

国家知識産権局のスライドは海賊版システムを使って作成されたと非難された。

南方都市報によると、昨日、「長城ブロードバンドエンジニア」という認証情報を持つ「スーパー新人」という...

偽造証明書のギャングがハッカーと共謀して多くの場所で政府のウェブサイトをハッキングし、数億元が被害に遭った。

地図:張芳曼コアヒント「誠実に協力し、名誉を第一とする」と主張し、専門資格証明書は内部関係を通じて取...

ビットコイン価格が28%急落:中央銀行の声明がプレイヤーの信頼に打撃

新浪科技報、北京時間12月17日朝のニュースによると、中国人民銀行の最新の規制要求の影響を受けて、ビ...

中国招商銀行の馬衛華総裁:インターネット金融は銀行の存続を脅かす

新華社通信によると、「フェイスブックに代表されるインターネット金融は、将来的に銀行の存続に影響を与え...

優れたデザインはこうして生まれる: 優れたインターネット デザインに関する 100 のこと

文 | 楊英、王青、特別寄稿者胡雲、グラフィック | 李婷婷良いデザインには人々を魅了する力がありま...

ポリシー・アズ・コードとは何ですか?オープンポリシーエージェントの紹介

クラウドネイティブ時代においては、「セキュリティがなければ何もない」という言葉をよく耳にしますが、こ...

外部リンクの効果を高めるにはどうすればいいでしょうか?

外部リンクはオフサイト最適化効果を実現するための主な方法の1つと言えます。さらに、関連する外部リンク...