Redis 事務

redis事務介紹

事務能夠一次執行多個命令, 而且帶有如下三個重要的保證:php

  • 事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。;
  • 事務在執行的過程當中,其餘客戶端發送來的命令請求不會插入到當前事務執行序列中;
  • 事務是一個原子操做:收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其他的命令依然被執行

事務從開始到執行會經歷如下三個階段:redis

  • 開始事務
  • 命令入隊
  • 執行事務

注意:redis事務不支持回滾數組

相關命令

  • MULTI
    • 說明: multi用於標記一個事務塊的開始;事務塊內的命令會按照前後順序被放進一個隊列中,最後由exec命令原子性的執行
    • 返回:老是返回OK;
  • EXEC
    • 說明:用於執行全部事務塊內的命令;
    • 返回:事務塊內全部命令的返回值,按命令的執行的前後順序排列;若事務執行被打斷,則返回nil;
    • 實例:
    10.117.8.188:6379> MULTI
    OK
    10.117.8.188:6379> set string4 'string4'
    QUEUED
    10.117.8.188:6379> set string3 'string3'
    QUEUED
    10.117.8.188:6379> del string
    QUEUED
    10.117.8.188:6379> EXEC
    1) OK
    2) OK
    3) (integer) 1
  • DISCARD
    • 說明:用於取消事務,放棄執行事務塊內全部的命令;
    • 返回:老是返回OK;
    • 實例:
    10.117.8.188:6379> MULTI
    OK
    10.117.8.188:6379> del string4
    QUEUED
    10.117.8.188:6379> del string3
    QUEUED
    10.117.8.188:6379> DISCARD
    OK
  • WATCH key [key1 ... ]
    • 說明:監視一個或多個key,若是在事務執行以前這個(或這些)key被其餘命令所改動,那麼將打斷事務的執行;WATCH命令在事務執行exec以後,不管執行是否成功,就不在監聽這個(或這些)key;客戶端關閉,則該客戶端的監聽就會取消;
    • 返回:老是返回OK;
    • 實例:
    客戶端2:
    set string1 '1111'
    OK
    
    客戶端1:
    10.117.8.188:6379> WATCH string1
    OK
    10.117.8.188:6379> MULTI 
    OK
    10.117.8.188:6379> set string1 'string1'
    QUEUED
    10.117.8.188:6379> set string3 'val3'
    QUEUED
    10.117.8.188:6379> EXEC
    (nil)
    因爲string1的值發生變化,事務被打斷,返回nil;
  • UNWATCH
    • 說明:取消WATCH監控的全部的key;
    • 返回:老是返回OK;
    • 實例:
    10.117.8.188:6379> UNWATCH
    OK

    事務的錯誤

  • 事務EXEC前的錯誤:入隊的命令出錯;入隊成功會返回QUEUED,不然就是入隊失敗;入隊若是失敗,客戶端就會中止並取消該事務;
  • 命令可能在EXEC調用以後失敗,此時事務中的錯誤不會被處理,事務會繼續往下執行code

    phpredis使用事務介紹

  • multi, exec, discard
    • 說明:執行或者退出事務
    • 參數:multi和pipeline的做用相似,都是開始一個事務,可是pipeline開啓的事務不具備原子性,可是速度比multi更快,multi開啓的事務具備原子性;exec執行事務,discard取消事務;
    • 實例:事務正常執行
    $redis->multi();
        //$redis->pipeline();
        $redis->set('string1','kkk12');
        $redis->set('string2','kooo2');
        $redis->get('string1');
        $res = $redis->exec();
        var_dump($res);
        //返回值:
        array(3) { 
            [0]=> bool(true) 
            [1]=> bool(true) 
            [2]=> string(5) "kkk12" 
        }
    
        // 事務被取消
        $redis->multi();
        $redis->set('string1','k234');
        $redis->set('string2','kooo2');
        $redis->get('string1');
        $res = $redis->discard();
        var_dump($res);
        //返回值:
        bool(true)
  • watch(key1,key2,...), unwatch
    • 說明:watch監控一個或多個key,unwatch取消全部的監控;若是在multi和exec之間,被監控的key發生變化,則事務執行返回false;
    • 參數:一個string類型的key或者多個key組成的數組
    • 實例:事務執行過程當中被打斷
    第一段代碼:
        $redis->watch('string1');
        $redis->multi();
        $redis->set('string1','k234');
        $redis->set('string2','kooo2');
        $redis->get('string1');
        sleep(10);
        $ret = $redis->exec();
        var_dump($ret);
    
        第二段代碼:
        $redis->connect('10.117.8.188',6379);
        $res = $redis->set('string1','llll1');
        var_dump($res); //true
    
        第一段代碼exec未執行以前,執行第二段代碼,等待第一段代碼執行結束,打印$ret:false
相關文章
相關標籤/搜索