Redisの分散ロックは、複数のプロセスまたは複数のスレッドの下で単一のプロセスまたは単一のスレッドを実行する問題を解決します。

Redisの分散ロックは、複数のプロセスまたは複数のスレッドの下で単一のプロセスまたは単一のスレッドを実行する問題を解決します。

[[423225]]

1. はじめに

注文書の作成などのビジネス開発では、データが複数回挿入されるのを防ぐために、注文がデータベースに書き込まれるようにするために、通常、単一のスレッドが必要です。

最近はコンテナが2つあります。プログラムの実行中は、複数の通知が送信されます。次に、同時に 1 つのプロセス (1 つのコンテナー) のみが実行されるようにする必要があります。現時点では、この問題を解決するために分散ロックが使用されます。

この問題に対する解決策は業界内に数多く存在し、ここでは Redis 分散ロックを使用して解決します。

簡単に言えば、golang redis ライブラリを使用して次のソリューションを実装できます。

2. Redis分散ロックの実装

2.1 setnx+期限切れ

setnx key value は、キーを値に設定します。キーが存在しない場合にのみ成功します。キーが存在する場合は何も実行されません。成功した場合は 1 を返し、失敗した場合は 0 を返します。

SETNX は実際には SET IF NOT Exists の略語です。

  1. setnxキー
  2. キーの有効期限が切れる秒数

ただし、上記の 2 つの操作はアトミックではありません。最初の命令を実行した後にアプリケーションが失敗したり再起動したりしても、ロックは期限切れになりません。

2.2 Luaスクリプト

アトミック性は保証できないため、Lua スクリプトの実行のアトミック性を利用し、上記の 2 つの操作を Lua スクリプトにカプセル化することでアトミック性を実現できます。

  1. redis.call( 'setnx' ,KEYS[1],ARGV[1]) == 1の場合 
  2. redis.call( 'expire' ,KEYS[1],ARGV[2])
  3. それ以外 
  4. 0を返す
  5. 終わり;

2.3 TTLで設定

Redis バージョン 2.6.12 以降では、一連のパラメータによって SET コマンドの動作を変更できます。

  1. セット キー値 [EX 秒]
  2. [PX ミリ秒] [NX|XX]

文字列値 value をキーに関連付けます。

キーにすでに別の値が含まれている場合、SET はタイプに関係なく古い値を上書きします。

元々有効期間 (TTL) を持つキーの場合、このキーに対して SET コマンドが正常に実行されると、このキーの元々の TTL はクリアされます。

  • EX second : キーの有効期限を second 秒に設定します。 SET キー値 EX 秒は、SETEX キー秒値と同じ効果があります。
  • PX ミリ秒: キーの有効期限をミリ秒に設定します。 SET キー値 PX ミリ秒は、PSETEX キー ミリ秒値と同じ効果があります。
  • NX: キーが存在しない場合にのみ設定します。 SET キー値 NX は、SETNX キー値と同じ効果があります。
  • XX: キーがすでに存在する場合にのみ設定します。

直接使用すると、次のような問題が発生する可能性があります。

  • タイムアウトロック解除により同時実行が発生する

たとえば、スレッド A がロックを正常に取得し、有効期限を 30 秒に設定しても、スレッド A の実行時間が 30 秒を超えると、ロックは期限切れになり、自動的に解放されます。このとき、スレッド B がロックを取得し、スレッド A と B が同時に実行されます。

スレッド A と B 間の同時実行は明らかに許可されません。この問題を解決するには、一般的に 2 つの方法があります。

解決策: 1) 有効期限前にコードがリリースされていることを確認します。 2) ロックを取得するスレッドにデーモン スレッドを追加し、期限が切れそうでまだ解放されていないロックの有効時間を長くします。

ロックは別のスレッドによって誤って削除されました。

たとえば、スレッド A がロックを正常に取得し、有効期限を 30 秒に設定しても、スレッド A の実行時間が 30 秒を超えると、ロックは期限切れになり、自動的に解放されます。このとき、スレッド B がロックを取得します。 A が実行された後、スレッド A は DEL コマンドを使用してロックを解除します。ただし、スレッド B によって取得されたロックはまだ実行されていません。スレッド A は、実際にはスレッド B によって取得されたロックを解放します。

解決策は、値に現在のスレッドのロック フラグを設定し、キーを削除する前にキーに対応する値を検証して、現在のスレッドによってロックが保持されているかどうかを判断することです。 UUID を生成して現在のスレッドを識別し、Lua スクリプトを使用して識別を検証し、操作のロックを解除することができます。

研究記事:

https://xiaomi-info.github.io/2019/12/17/redis-distributed-lock/

https://zhuanlan.zhihu.com/p/115848078

<<:  VMware は、企業のデジタル変革を実現する 3 つの主要戦略と多様な製品により、エンタープライズ クラウド イノベーションを推進しています。

>>:  クラウドへの移行コストが急増しており、クラウド コンピューティング料金を改革する時期が来ています。

推薦する

週刊ニュースレビュー:タオバオ店のオーナーがアルパカ飼育に転職、Qvodが倒産、映画局はどこへ向かうのか?

1. WeChatはもはや乱暴に成長することはなく、友達の数を制限し、Weiboが大手Vにハイジャッ...

ソフト記事マーケティングにおけるニュースマーケティング

ニュースとは、人々が知らない、知りたくない、あるいは知るべき最新の事実を報道することです。人間は知識...

Baiduライブラリの運用プロセスと注意すべき詳細

インターネット上の競争は激化しており、オンラインでのプロモーション方法も常に改善されています。ウェブ...

SEO最適化に別れを告げ、フォーラムを使ってウェブサイトを宣伝しましょう

SEO 最適化は、検索エンジンと競合他社によって制限されます。注意を払わない限り、特に比較的重みの低...

業界ウェブサイト連載:急がず

「急げば速くなる」ということわざがあります。業界のウェブサイトであろうと他のサイトであろうと、短期間...

クラウドネイティブ災害復旧製品 HyperBDR の自動テスト実践

HyperBDR は、クラウド ネイティブ コンセプトに基づいた移行および災害復旧製品です。コアビジ...

Vaicdn: 登録/実名CDNは不要、帯域幅が大きく、防御力が高く、攻撃がレイテンシに影響を与えない

vaicdn はインテリジェントな加速とセキュリティ保護サービスを提供しており、1S 内で悪意のある...

パンデミックにより企業はクラウドへの移行を迫られるだろうが、パブリッククラウドは非常に一般的なクラウドオプションである。

10月14日、海外メディアは、新型コロナウイルスの流行が多くの企業に影響を与えているが、一部の企業は...

yourserver - スウェーデンの VPS、1Gbps の帯域幅、無制限のトラフィック、苦情防止、著作権なし、月額料金は 4 ユーロから

yourserver はラトビアの VPS 販売業者です。設立年は明らかではありません (このサイト...

Baiduのアルゴリズムは頻繁に調整されるため、SEO担当者は対応する必要がある

2012 年 2 月以来、Baidu は頻繁にアルゴリズムを調整しています。アルゴリズム調整の影響は...

おすすめ: greengeeks - 35% オフ/無制限 SSD/SS サポート/生涯ギフト com/cpanel パネル

greengeeks、これは力強い紹介が必要です: ブラック フライデーで 65% オフ、Web サ...

hivelocity: 高トラフィックの米国 VPS、月額 4 ドル、1G メモリ/1 コア (AMD EPYC Rome)/20GSSD/10T トラフィック/1Gbps 帯域幅、ロサンゼルス/ニューヨーク/タンパ

2002年に米国で設立され、世界40カ所のデータセンターを運営する独立系サーバーレンタルおよび機器ホ...

中国オーディオ業界の製品に関する洞察と分析

現在、オンラインオーディオ市場の規模は拡大しており、コンテンツにお金を払うという概念を形成するユーザ...

直線対曲面、曲面は超薄型製品の未来のリーダーに挑戦できるでしょうか?

はじめに: サムスンや LG など多くのカラーテレビメーカーが推進する曲面 LED バックライト付き...

弁護士のためのウェブサイト最適化の開発パス

今はインターネットの時代です。インターネットは私たちの生活を変え、生活に欠かせないものになりました。...