Redis入門事務(楽観錠)


文書ディレクトリ

  • Redisベース
  • トランザクション
  • 楽観ロック
  • Redisベース


    取引


    Redisトランザクションの本質:コマンドのセット!1つのトランザクションのすべてのコマンドがシーケンス化され、トランザクションの実行中に順番に実行されます.
    使い捨て、順序性、排他的な実行コマンド!
    Redisのトランザクションに独立性レベルの概念がなければ、汚れた読み取り、幻の読み取りは起こり得ません.すべてのコマンドはトランザクションで直接実行されるのではなく、実行コマンドが開始されたときに一緒に実行されます.
    Redisの単一コマンドは原子性を維持しますが、トランザクションは原子性を保証しません!
    Redisのトランザクション:3ステップ!
  • オープントランザクション:multi
  • コマンドエンキュー:通常のコマンド
  • トランザクションの実行:exec
  • トランザクションの正常な実行
    127.0.0.1:6379> multi      #    
    OK
    #    
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> get k1
    QUEUED
    127.0.0.1:6379> set k3 v3
    QUEUED
    127.0.0.1:6379> exec   #    
    1) OK
    2) OK
    3) "v1"
    4) OK
    

    トランザクションの破棄
    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> set k4 v4
    QUEUED
    127.0.0.1:6379> discard   #      
    OK
    127.0.0.1:6379> get k4    #        
    (nil)
    

    コンパイル型例外(Javaではコードエラー、Redisではコマンドエラー)は、トランザクション内のすべてのコマンドが実行されません。
    127.0.0.1:6379> FLUSHALL
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> sets k2 v2   #     
    (error) ERR unknown command `sets`, with args beginning with: `k2`, `v2`, 
    127.0.0.1:6379> set k3 v3
    QUEUED
    127.0.0.1:6379> exec   #      
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379> get k3   #          
    (nil)

    実行時異常(1/0などの構文エラー)は、トランザクションを実行するときに他のコマンドが正常に実行されます。エラーコマンド異常放出{{えらーこまんど:れいがいほうしゅつ}}
    127.0.0.1:6379> FLUSHALL
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 k2
    QUEUED
    127.0.0.1:6379> incr k1   #    ,          
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> get k2
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (error) ERR value is not an integer or out of range  #      
    3) OK
    4) "v2"
    127.0.0.1:6379> get k2   #        !
    "v2"
    127.0.0.1:6379> get k1
    "k2"

    楽観ロック


    その名の通り:楽観的で、いつでも間違いがないと思っているので、鍵をかけません!
    鍵をかけていないので、もし誰かがデータを変更したらどうしますか?更新するときは、その間にこのデータを修正してくれる人がいるかどうかを判断してみましょう.
    Redis監視テスト!watch
  • 正常実行
  • 127.0.0.1:6379> set money 100    #      100  
    OK
    127.0.0.1:6379> set out 0    #   0
    OK
    127.0.0.1:6379> watch money    #       
    OK
    127.0.0.1:6379> multi   #    
    OK
    127.0.0.1:6379> decrby money 30   #         
    QUEUED
    127.0.0.1:6379> incrby out 30   #     30,       
    QUEUED
    127.0.0.1:6379> exec  #    
    1) (integer) 70
    2) (integer) 30
    
  • マルチスレッド修正値、実行失敗
  • #     ,     
    127.0.0.1:6379> watch money    #     
    OK
    127.0.0.1:6379> multi    #    
    OK
    127.0.0.1:6379> decrby money 20   #    20         
    QUEUED
    127.0.0.1:6379> incrby out 20    #      20
    QUEUED
    
    
    #           ,   (     )    ,         100  ,       ,               !
    127.0.0.1:6379> get money  #      70   
    "70"
    127.0.0.1:6379> incrby money 100   #       100    
    (integer) 170
    
    
    #         ,     (     )
    127.0.0.1:6379> exec   #    
    (nil)
    
    

    では、どうやってこの問題を解決しますか.あなたはまだ買い物をしたいと思っていますか.お金が使えないことに気づくと硬くなる
    #   ,       ,             ,             ,    
    127.0.0.1:6379> UNWATCH   #          ,  
    OK
    127.0.0.1:6379> watch money   #      
    OK
    127.0.0.1:6379> multi   #    
    OK
    127.0.0.1:6379> decrby money 20 #   
    QUEUED
    127.0.0.1:6379> incrby out 20 #     
    QUEUED
    127.0.0.1:6379> exec  #    ,             ,        ,     !
    1) (integer) 150
    2) (integer) 50

    楽観的なロックは秒殺シーンに使えます!