Heim  >  Artikel  >  Datenbank  >  Redis-Transaktionsoperationsbefehle und Ausführungsoperationen (Code)

Redis-Transaktionsoperationsbefehle und Ausführungsoperationen (Code)

不言
不言Original
2018-09-19 16:06:012358Durchsuche

In diesem Artikel geht es um die Befehle und Ausführungsvorgänge (Code) von Redis-Transaktionsvorgängen. Ich hoffe, dass er für Freunde hilfreich ist.

Vorwort

Dieser Artikel untersucht hauptsächlich den Transaktionsbetrieb von Redis

Befehl

Multi und Exec

  • Die Befehlszeile

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-Instanz

    @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"));
    }

führt das

  • Befehlszeile

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"
  • salatinstanz

    @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 mit verwerfen

  • Befehlszeile

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"
  • Salatinstanz

    @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"));
    }
Überprüfen und einstellen

    @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));
    }

Zusammenfassung

  • reids bietet Multi-Exec-/Discard-Anweisungen, ähnlich der Open-Commit-/Rollback-Transaktion, aber Exec wird nicht ausgeführt, wenn Fehler wie Typoperationen auftreten erfolgreich ausgeführt werden, und der Befehl, der fehlschlagen sollte, wird trotzdem erfolgreich ausgeführt. Fehler

  • Was Multi Exec garantiert, ist, dass eine Reihe von Befehlen ausgeführt werden, solange der Exec-Befehl erfolgreich ausgeführt wird Die Transaktion kann ausgeführt werden. Wenn die Ausführung aufgrund von Netzwerkproblemen usw. nicht vom Server empfangen wird, wird eine Reihe von Befehlen in der Transaktion nicht ausgeführt

  • kann nur verworfen werden Wird verwendet, wenn multi aufgerufen wird. Dieser Befehl löscht die Transaktionswarteschlange von Befehlen, die auf die Ausführung warten.

  • Redis stellt den Befehl watch bereit, der mit multi exec verwendet werden kann, um einen optimistischen Sperrmechanismus zu implementieren Ähnlich wie bei der Datenbank, sobald der Überwachungsschlüssel von anderen Clients aktualisiert wird, schlägt der gesamte Exec-Vorgang fehl

Das obige ist der detaillierte Inhalt vonRedis-Transaktionsoperationsbefehle und Ausführungsoperationen (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn