05.redisトランザクション

4078 ワード

05.redisトランザクション
目次
  • Redisトランザクション
  • トランザクション
  • 1. コマンド順序
  • 2. 常時原子
  • 使用トランザクション
  • を開始
  • Redisトランザクションでエラーが発生しました
  • 1. EXEC前のエラー
  • 2. EXEC後のエラー
  • なぜエラーがroll backsをサポートしないのですか?

  • Redisの楽観的ロックcheck-and-set
  • を実現
  • 小結

  • Redisトランザクション
    Redis操作時にトランザクションをサポートします.トランザクションには原子間atomicがあり、トランザクションに含まれる操作はすべて成功するか、失敗します.しかしredisはロールバックをサポートしていませんが、テスト開発の一環で誤った操作を避けることができます.原子性的には半支持と言えるが、後の原因を見ると.多くの場合、トランザクション操作が必要です.翻訳者:https://redis.io/topics/transactions実際の操作:python版使用リファレンスhttps://github.com/7Edge/redis-demo/blob/master/redis_pipeline.py
    取引
    MULTI,EXEC,DISCARD,WATCHオペレーションは,いずれもredisトランザクションの基礎オペレーションである.これらの操作は、1組の操作を1つの操作原子と見なして実行することができる.できるのは、2つの重要な保障のためです.
    1.コマンドの順序付け
    トランザクション内のすべてのコマンドは順序付けされており、実行は順序付けされています.別のクライアント接続でエラーが発生した場合、現在実行中のトランザクションに影響を与えることはできません.これにより,命令実行時に互いに隔離された操作であることが保証される.単一スレッドであるため、redisserverはi/o多重化を利用して同時接続を処理する.
    2.常に原子
    トランザクションでは、すべてのコマンドが実行されても、1つのコマンドが実行されても、redisのトランザクションは原子です.EXECコマンドは、トランザクション内のすべてのコマンドの実行を開始し、multiコマンドを呼び出す前にクライアントからserver側への接続が切断されていなければ、実行される操作はありません.EXECコマンドが実行されると、すべての操作が実行されます.構成時にappend-only fileが使用されている場合、redisはsingle write(2)syscallをaofファイルに書き込みます.ただし、redis server crashesまたは管理者にkillを強制された場合、一部の操作のみが登録されている可能性があります.この場合、redisは再起動時にこの状況を発見し、起動に失敗して終了し、エラーを報告します.この場合、aofファイルを修復し、一部のトランザクションのみを削除してからredisを再起動するredis-check-aofツールを使用します.
    トランザクションの使用を開始
    1.   MULTI  #     ,   OK    
    2.         #       ,   QUEUED,          
    3. EXEC  #   ,                
    
    4. DISCARD    EMULTI  EXEC       , EXEC      flush                 

    Redisトランザクションでエラーが発生しました
    トランザクションでは、いくつかの操作で実行エラーが発生する可能性があります.大体2つのコマンド実行エラーがあります.
    1.EXEC前のエラー
    EXECコマンドを実行する前に、コマンドがキューに正常に追加されなかったエラーがあります.たとえば、実行されるコマンドパラメータの個数エラー、コマンド名の使用エラーなどです.
    このようなエラーに対して、clientは、コマンドを実行するときにコマンドキューに追加されるため、QUEUEDに戻って参加が成功したことを示すと、他の戻りはエラーであることを感知することができる.このエラーにより、ほとんどのクライアントはトランザクションを中断し、自動的にDISCARDトランザクションを実行します.(pythonのredisモジュールでは、pipelineとmulti/execが結合しているため、redis.exceptions.ResponseErrorが異常であるが、異常がないコマンドが実行されるのは、pipelineと結合しているためである)しかし、Redis 2.6.5以降、serverは累積コマンドが命令キューに記録されると、EXECが実行され、serverはトランザクションの実行を拒否し、エラーを返します.自動化
    Redis 2では6.5以前、このエラーに対してserver動作は、エラーが発生したにもかかわらず、コマンドセットのサブセットが1回実行されることに相当するキューに正常に追加されたコマンドのみを実行することであった.Redis 2.6.5 serverはこのような処理ロジックを持たず、新しいコマンドにロジックを追加します.pipelineパイプコマンドです.パイプは前の動作を実現し、パイプはコマンドの戻り結果のリストを返します.
    2.EXEC後のエラー
    エラーはEXEC実行後、key競合などです.このエラーでは、handleメソッドがない場合、新しいコマンドがトランザクション中にエラーが発生しても、他のすべてのコマンドが実行されます.
    なぜエラーがroll backsをサポートしないのですか?
    リレーショナル・データベースのように、トランザクションはロールバックをサポートし、redisトランザクションではエラーの発生をサポートします.redisがこのような行為をしたのは、次の2つの点からです.
  • redisコマンドが失敗したのは、構文エラーまたは存在するkeyがエラーのデータ型に変更されただけです.これらのエラーは、開発またはテストの段階で発見されやすい.
  • redisは、roll back能力を必要とせず、簡単で迅速であるべきである.

  • Redis事務所が指す原子性は、コマンドを実行キューに追加するプロセスにのみ適用され、Redisトランザクションはコマンド実行中のエラーロールバックをサポートしません.
    Redisの楽観的なロックはcheck-and-setを実現します
    同時トランザクションは、同じデータを変更する場合があります.redisトランザクションはスレッドを読むときに隔離されていますが、データをロックし、独占的に使用する必要がある場合があります.redisが提供する楽観的なロックを使用してデータをロックするしかありません.この楽観的なロックはトランザクションに合わせて使用できません.チェックの動作は、トランザクションがEXECを実行するときに変化があれば、ではEXECの実行は失敗しました.WATCHは、redisトランザクションでCAS動作を提供するために使用される.CASは私たちがよく言う楽観的なロックです.
    楽観的なロックのトランザクションの実行に失敗した場合は、結果を検出する必要があります.失敗した場合は再試行します.
    トランザクションの4つの特性ACIDを知っています.
    Atomic   :       ,     ,       。
    Redis                         ,Redis                  。
    
    Consistency    :     ,                     。           。
    
    Isolation    :      ,                   。        ,        ,                      ,             。       ,     ,    ;      ,       。
    
    Durability    :       ,      ,     。                     ,              。

    WATCHコマンドはkeyの変更を監視するために使用されます.監視されたkeyがEXECを実行する前に変更された場合、このトランザクションはabortsになり、トランザクションが失敗したことを示すNullが返されます.データをロックするトランザクションの前に使用できます.WATCH配合MULTIとEXEC
    UNWATCHを使用すると、すべてのWATCHED keysをflushで削除できます.
    小結
  • Redis事務所が指す原子性は、命令を実行キューに入れるプロセスのみに対して、Redisトランザクションは命令実行中のエラーロールバック
  • をサポートしない.
  • はwatchを利用してデータを楽観的にロックすることができる.楽観cas、悲観は人を待たせる.