ホームページ  >  記事  >  データベース  >  Redis トランザクション操作コマンドと実行操作 (コード)

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

不言
不言オリジナル
2018-09-19 16:06:012366ブラウズ

この記事の内容は、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 サイトの他の関連記事を参照してください。

      声明:
      この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。