六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

Redis的事務設置的命令與執行設置(代碼)

[摘要]本篇文章給大家帶來的內容是關于Redis的事務操作的命令與執行操作(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。序本文主要研究一下redis的事務操作命令multi與exe...
本篇文章給大家帶來的內容是關于Redis的事務操作的命令與執行操作(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

本文主要研究一下redis的事務操作

命令

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"
  • lettuce實例

    @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"
  • lettuce實例

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

check and set

    @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提供multi exec/discard指令,類似open commit/rollback transaction,不過exec遇到類型操作等錯誤時不會滾,該成功執行的命令還是成功執行,該失敗的還是失敗

  • multi exec保證的是,只要exec命令有執行成功,則事務中一系列的命令都能執行,如果exec因為網絡等問題,server端沒有接收到,則事務中的一系列命令都不會被執行

  • discard需要在有調用multi的前提下才能使用,該命令會清空事務隊列等待執行的命令

  • redis提供watch指令,可以配合multi exec來使用,可以實現類似數據庫的樂觀鎖的機制,一旦watch的key被其他client有更新,則整個exec操作失敗

以上就是Redis的事務操作的命令與執行操作(代碼)的詳細內容,更多請關注php中文網其它相關文章!


學習教程快速掌握從入門到精通的SQL知識。




主站蜘蛛池模板: 色综合久久综合网欧美综合网 | 日本欧美不卡一区二区三区在线 | 五月天丁香婷婷综合久久 | 在线视频一区二区日韩国产 | 一区二区三区福利视频 | 天堂网www在线观看 天堂网www在线 | 四虎在线成人免费网站 | 欧美一级在线观看视频 | 在线精品亚洲 | 情不自禁完整版在线观看免费 | 亚洲成人自拍 | 欧洲日韩视频二区在线 | 深夜视频免费看 | 亚洲高清视频在线观看 | 婷婷影院在线观看 | 在线观看视频中文字幕 | 天堂网www在线资源中文 | 最新福利片v国产片 | 天堂在线观看免费视频 | 青青热久久综合网伊人 | 一本久道久久综合 | 欧美又粗又硬又大久久久 | 亚洲自偷精品视频自拍 | 性人久久久久 | 天天看天天爽天天摸天天添 | 日韩欧美一区二区不卡 | 色婷婷九月 | 欧美在线高清视频播放免费 | 亚洲精品亚洲人成在线播放 | 色婷婷丁香| 日韩女人毛片在线播放 | 亚洲欧美婷婷 | 欧美一级大片免费看 | 青青影院在线播放免费 | 日韩欧美国产综合 | 欧美亚洲视频在线观看 | 天天干在线影院 | 热久久99影院| 中文字幕第38页永久乱码 | 天天色国产 | 亚洲成a v人片在线观看 |