Redisの学習記事:ACIDの特性とトランザクション処理

目次

1.Redisトランザクションの概要

2、ACIDの特性

1.アトミシティ

2.一貫性

3.分離

4、持久性

3つの楽観的ロックと悲観的ロック

4、WATCHコマンド


XiaobaiはRedisの2番目のレコードを学習します。最後のレコードは、主にRedisを理解し、そのデータ型と基礎となるデータ構造を理解することです。詳細については、「基礎となるデータ構造とアプリケーションの原則から始まるRedisの概要」を参照してください次に、この記事でRedisトランザクションの一部を記録したいと思います。これもより重要なコンテンツだと思います。トランザクションのACID機能はRedisに固有のものではありません。Mysqlデータベースにもあります。したがって、この一般的な機能はデータベースのコアポイントであり、原理を理解する必要があります。

データベースは、データベースの整合性と通常の操作を保証するための同時実行制御とブロックメカニズムを備えたマルチユーザー指向の共有管理システムです。トランザクションは、整合性、同時実行制御、およびロックアウトメカニズムを保証する単位です。これは、集合的な単位としての一連のデータベースコマンドで構成されます。リレーショナルデータベースと非リレーショナルデータベースの両方にトランザクションがあります。Redisトランザクションの関連コンテンツを見てみましょう。

1.Redisトランザクションの概要

Redisトランザクションによって実装される基本的なコマンド:MULTI、EXEC、DISCARD、WATCH

  • MULTI:Redisトランザクションを開始し、クライアントをトランザクション状態に設定します。
  • EXEC:トランザクションを送信し、EXEC間のコマンドキューにMULTIコマンドを実行すると、この時点でクライアントは非トランザクション状態になります。
  • DISCARD:トランザクションをキャンセルし、トランザクションキュー内のすべてのコマンドをクリアすると、クライアントはトランザクション状態を終了します。
  • 監視:キーと値のペアを監視します。監視されているすべてのキーと値のペアが変更されていない場合、トランザクションは正常に実行されます。変更されていない場合、トランザクションは実行されません。

現在、Redisトランザクションは、クライアントによって要求されたトランザクション内のコマンドを継続的に実行できることを保証しており、他のクライアントによって送信されたコマンド要求はこのプロセス中に送信されません。MULTIコマンドを受信すると、トランザクションコンテキストが開かれ、後続のコマンドがキューに入れられます。これらのコマンドは、サーバーがEXECコマンドを受信した後に実行されます

2、ACIDの特性

1.アトミシティ

トランザクションのアトミック性とは、トランザクション状態が開始された後、キュー内のコマンドが全体として見なされ、Redisがすべてのコマンドキューを正常に実行するか、すべて実行に失敗することを意味します。

127.0.0.1:6379> set name "xiaochen"
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name "charzous"
QUEUED
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> incrby age 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (integer) 24
127.0.0.1:6379> get name
"charzous"
127.0.0.1:6379> get age
"24"
127.0.0.1:6379>

 トランザクションステータスがオンになっていない場合、実行が完了した後、入力コマンドは「OK」で戻ります。マルチをオンにした後、入力コマンドは「QUEUE」で戻り、コマンドが入力されたこと示します。待ち行列。最後に、execコマンドがキュー内のコマンドを実行した後、すべての実行結果を配列で返します。

次に、トランザクションのアトミック性を確認し、意図的に間違ったコマンド形式を入力しますset(key-valueなし)

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name "test"
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set sex "male"
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>

(エラー)EXECABORTトランザクションは以前のエラーのために破棄されました。

エラー情報が返されます。Redisは、実行キュープロセスに誤ったコマンド入力があったため、トランザクションの実行に失敗し、チェックしたばかりの情報が更新または増加しなかったことを検出しました。

127.0.0.1:6379> get age
"24"
127.0.0.1:6379> get name
"charzous"
127.0.0.1:6379> get sex
(nil)
127.0.0.1:6379>

ここには別の状況があります。たとえばこの時点で名前フィールドに5を追加すると、入力されたコマンドのタイプが間違っています。incrbyname5は、次の状況が発生します。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name "test"
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> incrby name 5
QUEUED
127.0.0.1:6379> set sex "male"
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK
127.0.0.1:6379>

現時点では、タイプが間違っているコマンドのみが実行に失敗し、他のコマンドは影響を受けません。

127.0.0.1:6379> get name
"test"
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> get sex
"male"

2.一貫性

トランザクションの一貫性とは、トランザクションの実行前後でデータベース内のデータに一貫性があることを意味します。最初は理解しにくいと思いますが、ここでの一貫性は、データベースが現在の状態から新しい状態に変化し、データが前後のデータ自体の定義と要件を満たしていることです。違法または無効なダーティデータが含まれていません文字通りの意味は次のとおりです。データ自体の定義はデータ型の特性であり、データ型の制約は変更されません。

トランザクションのアトミック性が上記で検証されたように、間違ったコマンドが入力された場合、トランザクションの実行は失敗し、アトミック性と一貫性が保証されます。

3.分離

トランザクション分離とは、複数のユーザーが同時にデータベースにアクセスし、データベースがユーザーごとに個別にトランザクションを開くことを意味します。これらは相互に干渉せず、相互に分離されているため、トランザクションを同時状態およびシリアルで実行する効果が得られます。実行。まったく同じ。

Redisには独自の特性があるため、シングルプロセスのシングルスレッドモデルを使用してキーと値のペアのストレージを実現します。データベースコマンドを実行するときは、シングルスレッドの方法を使用します。他のコマンドは、最後のトランザクションが実行されるまで実行されません。実行されました。

4、持久性

トランザクションの耐久性とは、トランザクションが正しく実行された後、データベースへの変更が永続的であることを意味します。データベースに障害が発生しても、トランザクションの実行後に操作が消えることはありません。

Redisの永続性は、独自の永続化方法に由来します。Redisでは、AOFおよびRDB永続化メソッドを含め、非同期実行。

2つの永続化方法にはそれぞれ長所と短所があり、長所とシナリオを組み合わせることができます。

3つの楽観的ロックと悲観的ロック

この部分では、楽観的ロックと悲観的ロックは、まさにRedisトランザクションで使用される読み取りおよび書き込みデータメカニズムであり、WATCHコマンドはこの原則を使用します。

  • 楽観的ロック

名前が示すように、この種のロックには楽観的な性格があり、データベースにアクセスしてデータを読み取るたびに、他の人がデータを変更したり、データをロックしたりすることはないと思います。ただし、大まかな詳細もあります。データを更新する際に、期間中に他の人がデータを変更したかどうかを判断します。変更されている場合は更新が中止され、変更されていない場合は更新操作が実行されます。シナリオの使用:読み取りと書き込みを減らし、スループットを向上させます。

実装戦略:バージョン番号メカニズム。

データテーブルには、データのバージョン番号を記録する「バージョン」フィールドがあります。データを読み取るときに読み取られ、データを書き込むときにバージョン番号は+1になります。手元のバージョン番号とデータテーブルのバージョン番号を比較します。テーブルのバージョン番号よりも大きい場合は、データを更新します。それ以外の場合は、データが古く、更新されないことを意味します。

  • 悲観的なロック

同様に、名前が示すように、このロックには悲観的な性格があります。データをフェッチするたびに、他のユーザーによって変更されたと思われるため、他のユーザーの使用を制限するために毎回ロックします。従来のリレーショナルデータベースには、行ロック、テーブルロック、読み取りロック、書き込みロックなど、多数の悲観的なロックがあります。効率が明らかに制限されていることがわかります。

4、WATCHコマンド

トランザクションのWATCHコマンドは楽観的ロックです。トランザクション内のコマンドを監視するために使用されるため、EXECコマンドは条件付きで実行する必要があります。

WATCHコマンドで監視されているすべてのキーが変更されていないことを前提としてのみ、トランザクションを正常に実行できます。それ以外の場合、サーバーは実行を拒否し、実行が失敗したという空の応答をクライアントに返します。

実装戦略:

監視対象キーがデータベース関連コマンドを実行すると、touchWatchKey関数を呼び出して、変更されたデータベースキー監視するクライアントREDIS_DIRTY_CASロゴを開きます。サーバーがEXECコマンドを受信すると、クライアントがこのロゴを開いて実行するかどうかを決定します。トランザクション。

WATCHコマンドの効果を確認します。

絵文字に来て

良いと思う場合は、ブックマーク、フォロー、質問がある場合は直接コメント、交換して学ぶなど、「ワンクリック、3リンク」へようこそ。 


私のCSDNブログ:https://blog.csdn.net/Charzous/article/details/114546348

 

おすすめ

転載: blog.csdn.net/Charzous/article/details/114922587