Redis 事物、悲觀、樂觀鎖 (詳細)


 

1,概論

      事物這東西相信大家都不陌生吧,在學習Spring,Mybatis等框架中,

      只要是涉及到數據存儲和修改的,都會有事物的存在,

      廢話就不多說了下面我們來簡單的介紹下Redis事物以及鎖。


2,Redis事物簡介?

    Redis 事務可以一次執行多個命令, 並且我們來了解幾個重要的知識點:

  1. 開啟事物后,一切命令都會放入隊列當中,當執行EXEC以后才會挨個執行。
  2. 當執行EXEC命令后,如果隊列中有命令出錯,那么此隊列中的全部命令將不會執行(這里有兩種可能),后面會舉例介紹。
  3. 當事物執行以后,其他客戶端提交的命令請求不會插入到事務執行命令序列中。

  事物執行的三個階段:

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

3,Redis事物(Transaction)命令?

DISCARD 取消事務,放棄執行事務塊內的所有命令。
EXEC 執行所有事務塊內的命令。
MULTI 開啟事物
UNWATCH 取消 WATCH 命令對所有 key 的監視。
WATCH key 監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。

4,Redis事物使用?

  下面我們來通過幾個例子認識下

  1.正常執行

  

  2.放棄事物

     放棄事物,隊列里面的命令將不會執行。

  

 

 3.全體連坐

   一個命令出錯,隊列中的全部命令將不會執行。

  

  

  4.冤頭債主

    這個例子跟上面的差不多,只不過這個例子是執行了以后再報錯,他兩不同的地方就是

    上面是先知道錯誤,這個是執行后才知道錯誤了,舉個例子吧,

    比如 我要讓我的Redis數據數值增一操作,我在控制台執行命令,INCR key 當事物還沒執行的時候,

    也就是說這個命令還在隊列中,還沒執行,它是不知道我這個key到底是個數值還是個字符串,

    假設key不是個數值類型那么當執行事物后,這條命令將會報錯,其他的命令正常執行。

    

 

   5.WATCH監控

      在了解WATCH監控前我們先來聊聊樂觀鎖和悲歡鎖,

 

   ①悲觀鎖:我很悲觀,我覺得我每次去拿數據的時候都會被人修改,所以我每次拿數據的時候我就會上鎖,

       別人想拿這個數據的時候就會block,直到別人拿到鎖。傳統的關系型數據庫里面就會用到很多這種機制,

       比如 行鎖,表鎖,讀鎖,寫鎖等,都是在操作前加上鎖,防止多人修改同一條數據。這樣的話就成功提高了數據的一致性,降低了並發性。

 

   ②樂觀鎖:我很樂觀,我覺得我每次去拿數據的時候別人都不會修改,所以不會上鎖,但是我在更新數據的時候,

        我就會判斷一下,有沒有別人去更新這個數據,這里我們可以使用版本號等機制來實現判斷。

        樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量和並發性。

                樂觀鎖策略:提交版本必須大於記錄當前版本才能更新數據

   下面來看看WATCH怎么使用的

  一,無加塞篡改

    我這里就拿個花唄額度來舉例,假設我的balance為余額,arrears為欠下的余額,下面這張圖為

    無加塞篡改,先監控在開啟multi,保證兩筆金額變動在同一事物內,一起執行。

    

  二,有加塞篡改

      類似於我在修改這個數據的時候,被其他用戶已經修改了,已經被加上鎖了,我自己就修改不了了,要等被人修改完才能夠修改,這跟上面的樂觀鎖很相似,

        我開啟兩個控制台,一個用來正常操作,一個用來中途篡改數據。

      WATCH 監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。

      下面我們來看圖.

      

 

我還沒執行這些命令之前我根本不知道我的數據已經在被人修改了,當我要修改數據的時候已經被人先改了。

這時候我們UNWATCH命令就派上用場了,相當於當我修改數據的時候我就把鎖加上,修改完成后就把鎖解開,讓下一個人繼續修改數據,

取消 WATCH 命令對所有 key 的監視,一旦我們執行EXEC以后所有監控鎖都會被取消掉。

下面我們來看圖

 


  5,結尾

      后面還會更新如何使用RedisTemplate來操作Redis命令,如何解決Redis穿透/雪崩等。

      文章就寫到這里了,如果文章有需要改進的地方請大佬們在評論區里留言,謝謝點評。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM