Redis トランザクション操作コマンドと実行操作 (コード)

不言
リリース: 2018-09-19 16:06:01
オリジナル
2357 人が閲覧しました

この記事の内容は、Redis トランザクション操作のコマンドと実行操作 (コード) に関するものです。必要な方は参考にしていただければ幸いです。

はじめに

この記事では主にredis

Command

multiとexec

  • のトランザクション操作について学習します。コマンドライン

#
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr total
QUEUED
127.0.0.1:6379> incr len
QUEUED
127.0.0.1:6379> exec
1) (integer) 2
2) (integer) 2
127.0.0.1:6379> get total
"2"
127.0.0.1:6379> get len
"2"
ログイン後にコピー
  • #lettuce インスタンス

    @Test
    public void testMultiExec(){
        RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
        StatefulRedisConnection<String, String> connection = client.connect();
        RedisCommands<String, String> syncCommands = connection.sync();

        syncCommands.set("hello","1");
        syncCommands.set("world","2");

        syncCommands.multi();
        syncCommands.incr("hello");
        syncCommands.incr("world");

        //DefaultTransactionResult[wasRolledBack=false,result=[1, 2, 1, 3, 1]]
        TransactionResult transactionResult = syncCommands.exec();
        System.out.println(transactionResult);
        System.out.println(syncCommands.get("hello"));
        System.out.println(syncCommands.get("world"));
    }
ログイン後にコピー

    ## を部分的に実行します# コマンド行
  • #

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set a hello
    QUEUED
    127.0.0.1:6379> set b world
    QUEUED
    127.0.0.1:6379> incr a
    QUEUED
    127.0.0.1:6379> set c part
    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> get a
    "hello"
    127.0.0.1:6379> get b
    "world"
    127.0.0.1:6379> get c
    "part"
    ログイン後にコピー
  • #レタスインスタンス
    ##
    @Test
    public void testMultiExecError(){
        RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
        StatefulRedisConnection<String, String> connection = client.connect();
        RedisCommands<String, String> syncCommands = connection.sync();

        syncCommands.multi();
        syncCommands.set("a","hello");
        syncCommands.set("b","world");
        syncCommands.incr("a");
        syncCommands.set("c","part");
        //DefaultTransactionResult[wasRolledBack=false,result=[OK, OK, io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range, OK, 1]]
        TransactionResult transactionResult = syncCommands.exec();
        System.out.println(transactionResult);
        System.out.println(syncCommands.get("a"));
        System.out.println(syncCommands.get("b"));
        System.out.println(syncCommands.get("c"));
    }
ログイン後にコピー
##multi、discard
  • コマンド ライン
  • 127.0.0.1:6379> set sum 1
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> incr sum
    QUEUED
    127.0.0.1:6379> discard
    OK
    127.0.0.1:6379> get sum
    "1"
    ログイン後にコピー

    • レタス インスタンス

        @Test
        public void testMultiDiscard(){
            RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
            StatefulRedisConnection<String, String> connection = client.connect();
            RedisCommands<String, String> syncCommands = connection.sync();
            syncCommands.incr("key1");
            syncCommands.multi();
            syncCommands.incr("key1");
            //需要有multi才可以执行discard,成功返回OK
            String result = syncCommands.discard();
            System.out.println(result);
            System.out.println(syncCommands.get("key1"));
        }
    ログイン後にコピー
    確認と設定
          @Test
          public void testWatch(){
              RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
              StatefulRedisConnection<String, String> connection = client.connect();
              RedisCommands<String, String> syncCommands = connection.sync();
      
              String key = "key";
              syncCommands.watch(key);
      
              //another connection
              StatefulRedisConnection<String, String> conn2 = client.connect();
              RedisCommands<String, String> syncCommands2 = conn2.sync();
              syncCommands2.set(key, "a");
      
              syncCommands.multi();
              syncCommands.append(key, "b");
              //DefaultTransactionResult [wasRolledBack=true, responses=0]
              TransactionResult transactionResult = syncCommands.exec();
              System.out.println(transactionResult);
      
              System.out.println(syncCommands.get(key));
          }
      ログイン後にコピー
    • 概要

    • reids は、オープン コミット/ロールバック トランザクションと同様の複数の実行/破棄命令を提供しますが、タイプ操作などのエラーが発生した場合、exec は正常に実行されるはずのコマンドをロールしません。障害

      multi exec は、exec コマンドが正常に実行される限り、トランザクション内の一連のコマンドが正常に実行されることを保証します。ネットワークの問題などにより exec がサーバーに受信されなかった場合、トランザクション内の一連のコマンドは実行されません。
      • discard のみ使用できます。 multi を呼び出した後、このコマンドは実行を待機しているコマンドのトランザクション キューをクリアします
      • Redis は、multi exec と同様の楽観的ロック メカニズムを実装するために使用できる watch コマンドを提供します。データベースの監視キーが他のクライアントによって更新されると、実行操作全体が失敗します

      以上がRedis トランザクション操作コマンドと実行操作 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

      関連ラベル:
      ソース:php.cn
      このウェブサイトの声明
      この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
      人気のチュートリアル
      詳細>
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート
      私たちについて 免責事項 Sitemap
      PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!