Redis-Redisトランザクションの詳細な理解

3376 ワード

目次
  • Redisはどのようにトランザクションを実現しますか?
  • トランザクションで実行されたコマンドにエラーが発生しました.トランザクションはロールバックされますか?
  • 同じ接続でトランザクションを繰り返しオープンできますか?
  • 複数のクライアントが同時にトランザクションを開くとどうなりますか?
  • Redisトランザクションを使用するのはMULTIとEXECだけですか?
  • RedisのWATCHメカニズムはどのように実現されていますか?

  • Redisはどのようにトランザクションを実現しますか?
    トランザクションを解読するにはACIDの4つの原則を満たす必要があります.Redisがトランザクションを実装するメカニズムを知ることで、RedisがACIDをそれぞれ保証する方法を知ることができます.同時に、トランザクションの実装メカニズムを理解し、Redisトランザクションの優劣、使用時にRedisトランザクションの欠点をどのように回避するかを明らかにすることができます.
    リファレンス
  • Redisトランザクション
  • 概要
  • Redisは4つのコマンドによってトランザクションを実現する:WATCH,MULTI,EXEC,DISCARD,MULTI
  • .
  • RedisトランザクションはEXECコマンドで開始し、DISCARD/EXECコマンドで終了します.DISCARDはトランザクションのコミットに使用され、EXECはトランザクションのキャンセルに使用されます.
  • トランザクションが開始されると、Redisアクションコマンドはすぐには実行されず、トランザクションキューに先に入ります.Redisトランザクションキューは、FIFOキュー
  • である
  • MULTIコマンドを実行すると、トランザクションキュー内のコマンドが1つずつ実行され、コマンドによって中断されません.

  • トランザクションで実行されたコマンドにエラーが発生しました.トランザクションはロールバックされますか?
    通常、1つのトランザクションに1つ以上のRedis操作があり、いずれの操作も失敗する可能性があります.操作エラーが発生した場合、トランザクションの実行に影響しますか?
    リファレンス
  • Redisトランザクション
  • 概要
  • まず、Redisトランザクションではロールバックはサポートされていません.つまり、トランザクション内のコマンドの実行にエラーが発生した場合、実行済みのコマンドは撤回されず、後続のコマンドも実行されます.
  • Redisトランザクションのコマンドは、エンキューと実行の2つのフェーズに分けられます.エンキュー中にエラーが発生した場合、Redisはエンキュー中にエラーが発生したコマンドを無視し、後続のコマンドのエンキューには影響しません.実行中にエラーが発生すると、エラーコマンドはRedisに無視され、他のエラーのないコマンドが実行されます.

  • 同じ接続でトランザクションを繰り返しオープンできますか?
    本質的な問題を解読するには、トランザクションのネストを許可するかどうかです.
    リファレンス
  • Redis設計と実装-トランザクション
  • 剖析!Redisトランザクション実装原理
  • 概要
  • Redisトランザクションはネストできません.(error) ERR MULTI calls can not be nestedのコマンドを受信してトランザクションを開くと、エラーが返されます(redis-cliはMULTIのエラーが返されます)
  • .
  • ネストされたトランザクションがエラーを返すと、トランザクションキューがコマンドを受信し続けることには影響しません.トランザクションキュー内のデータは変更されません.

  • 複数のクライアントが同時にトランザクションを開くとどうなりますか?
    同時状況を解読すると、複数のクライアントが同時にトランザクションを開く場合が容易になります.このときRedisはクライアントメンテナンストランザクションキューを区別しますか?また、実際のエンジニアリングではパフォーマンスを向上させるためにRedis接続プールで接続を多重化するのが一般的ですが、この場合、接続多重化によるトランザクションのネストは発生しますか?
    リファレンス
  • Redis設計と実装-トランザクション
  • 剖析!Redisトランザクション実装原理
  • Sping Data Redisトランザクションを使用する場合、接続をオフにしない問題
  • 概要
  • Redisトランザクションキューは接続にバインドされており、異なる接続では同時にトランザクションを開くことができ、
  • に相互に影響を与えることはありません.
  • 合理的なトランザクションマネージャでは、トランザクションが開始されると接続がバインドされ、接続が他のリクエストによって多重化されないようにします.ただし、適切に適用しないと、接続が返されないという問題が発生します.
  • Redisトランザクションを使用するのはEXECMULTIだけですか?
    Redisトランザクションの解読は、単純にEXECWATCHだけではいけません.いくつかのkeyはトランザクションの実行時に変わったからです.正しいRedisトランザクションがトランザクションの実行を保証する必要がある場合、トランザクションに関連するデータは変更されません.
    リファレンス
  • Redis設計と実装-トランザクション
  • 概要
  • トランザクションを開始する前に、WATCHコマンドを使用して指定キーを監視し、楽観ロック
  • を形成する.
  • トランザクション実行時、WATCHのkeyによって変更された場合、トランザクションは失効し、実行できません.

  • RedisのWATCHメカニズムはどのように実現されていますか?
    無他を解読するのは、底辺の実現原理を理解するためだけだ.
    リファレンス
  • Redisトランザクション
  • Redis設計と実装-トランザクション
  • 概要
  • WATCHのkeyは、WATCHというkeyのすべてのclientリスト
  • を維持する.
  • WATCHのkeyが変更されると(任意の変更コマンドが実行される)、そのkeyのclientのREDIS_DIRTY_CASフィールドはすべてオープン状態に変更される.
  • トランザクションが実行されると、このclientのREDIS_DIRTY_CASフィールドが開かれると、少なくとも1つのデータが変更されたことを示し、トランザクションは実行できません.

  • Redis公式文書-transactionsを参照