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

 

1,概論

      事物這東西相信你們都不陌生吧,在學習Spring,Mybatis等框架中,數據庫

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

      廢話就很少說了下面咱們來簡單的介紹下Redis事物以及鎖。框架


2,Redis事物簡介?

    Redis 事務能夠一次執行多個命令, 而且咱們來了解幾個重要的知識點:學習

  1. 開啓事物後,一切命令都會放入隊列當中,當執行EXEC之後纔會挨個執行。
  2. 當執行EXEC命令後,若是隊列中有命令出錯,那麼此隊列中的所有命令將不會執行(這裏有兩種可能),後面會舉例介紹。
  3. 當事物執行之後,其餘客戶端提交的命令請求不會插入到事務執行命令序列中。

  事物執行的三個階段:spa

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

3,Redis事物(Transaction)命令?

DISCARD 取消事務,放棄執行事務塊內的全部命令。
EXEC 執行全部事務塊內的命令。
MULTI 開啓事物
UNWATCH 取消 WATCH 命令對全部 key 的監視。
WATCH key 監視一個(或多個) key ,若是在事務執行以前這個(或這些) key 被其餘命令所改動,那麼事務將被打斷。

4,Redis事物使用?

  下面咱們來經過幾個例子認識下

  1.正常執行

  

  2.放棄事物

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

  

 

 3.全體連坐

   一個命令出錯,隊列中的所有命令將不會執行。blog

  

  

  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穿透/雪崩等。

      文章就寫到這裏了,若是文章有須要改進的地方請大佬們在評論區裏留言,謝謝點評。

相關文章
相關標籤/搜索