辛星淺談Redis中的事務,辛星淺談Redis事務

來源:互聯網
上載者:User

辛星淺談Redis中的事務,辛星淺談Redis事務

     Redis也提供了對事務的支援,在Redis中,我們常用的命令就是multi、exec、discard、watch這四個命令。其中multi命令用於開始一個事務,該語句之後的所有命令都會被視為事務之內的操作,而exec是提交一個事務,discard是復原一個事務。



      下面是對一些命令的具體介紹:

       multi----用於標記事務的開始,其後執行的命令都被存放於命令隊列,直到執行exec時,這些命令才會被原子的執行。它的返回值總是OK。

       exec----執行在一個事務內命令隊列中的所有命令,同時將當前串連的狀態恢複為正常狀態,也就是所謂的非事務狀態。如果在事務中執行了watch命令,那麼只有當watch所監控的keys沒有被修改的前提下,exec命令才能執行事務隊列中的所有命令,否則exec將放棄當前事務中的所有命令。它原子性的返回事務中各個命令的返回結果。如果在事務中使用了watch,一旦事務被放棄,那麼exec將返回null-multi-bulk這個回複。

        discard--復原事務隊列中的所有命令,同時將當前串連的狀態恢複為正常狀態,也就是非事務狀態。如果watch命令被使用,該命令將unwatch所有的keys。始終返回OK。

        watch---在multi命令執行之前,可以指定待監控的keys,在執行exec之前,如果被監控的keys發生了修改,那麼exec將會放棄執行該事務隊列中的所有命令。它始終返回OK。

         unwatch----取消當前事務中指定監控的keys,如果執行了exec或者discard命令,則無需手工執行該命令,此時所有被監控的keys都會被自動取消。它始終返回OK。

         

            在Redis的事務中,watch命令可以用於提供CAS功能,所謂CAS就是Check  And Set功能。假設我們通過watch命令在事務執行之前監控了多個keys,加入在我們watch之後有任何的key的值發生了變化,那麼exec命令執行的事務都會被放棄,同時返回一個Null  multi-bulk應答以通知調用者事務執行失敗。

  

          首先我們看一段代碼:

           val  = get  key1

           val  =  val + 1

           set    key1   val

        如果在同一時刻有多個用戶端執行上述代碼,那麼就可能會出現多線程中經常出現的一種問題----競態爭用。比如兩個用戶端都讀取了key1的原有值,如果該值原來為18,那麼都執行上述代碼後,有可能這兩個在讀取資料的時候都讀到的是18,導致最後的程式得到的結果是19,而不是我們想象中的20.我們使用如下命令則可以避免這個問題:

          watch   key1

          val   =   get   key1

          val   =  val  + 1

          multi  

          set   key1    val  

          exec

          上面我們的代碼中,因為watch   key1命令在前面,也就是在擷取key1對應的值的時候監控了改建,注意我們這裡是把set包圍在事務中,如果該值被修改過了,由於watch的存在,那麼該操作將會失敗,因此我們可以在判斷返回值來知道val是否已經被修改過,然後我們可以選擇是否需要重新執行該命令。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.