事物這東西相信你們都不陌生吧,在學習Spring,Mybatis等框架中,數據庫
只要是涉及到數據存儲和修改的,都會有事物的存在,併發
廢話就很少說了下面咱們來簡單的介紹下Redis事物以及鎖。框架
Redis 事務能夠一次執行多個命令, 而且咱們來了解幾個重要的知識點:學習
事物執行的三個階段:spa
DISCARD | 取消事務,放棄執行事務塊內的全部命令。 |
EXEC | 執行全部事務塊內的命令。 |
MULTI | 開啓事物 |
UNWATCH | 取消 WATCH 命令對全部 key 的監視。 |
WATCH key | 監視一個(或多個) key ,若是在事務執行以前這個(或這些) key 被其餘命令所改動,那麼事務將被打斷。 |
放棄事物,隊列裏面的命令將不會執行。3d
一個命令出錯,隊列中的所有命令將不會執行。blog
這個例子跟上面的差很少,只不過這個例子是執行了之後再報錯,他兩不一樣的地方就是隊列
上面是先知道錯誤,這個是執行後才知道錯誤了,舉個例子吧,事務
好比 我要讓個人Redis數據數值增一操做,我在控制檯執行命令,INCR key 當事物還沒執行的時候,字符串
也就是說這個命令還在隊列中,還沒執行,它是不知道我這個key究竟是個數值仍是個字符串,
假設key不是個數值類型那麼當執行事物後,這條命令將會報錯,其餘的命令正常執行。
我這裏就拿個花唄額度來舉例,假設個人balance爲餘額,arrears爲欠下的餘額,下面這張圖爲
無加塞篡改,先監控在開啓multi,保證兩筆金額變更在同一事物內,一塊兒執行。
相似於我在修改這個數據的時候,被其餘用戶已經修改了,已經被加上鎖了,我本身就修改不了了,要等被人修改完纔可以修改,這跟上面的樂觀鎖很類似,
我開啓兩個控制檯,一個用來正常操做,一個用來中途篡改數據。
WATCH 監視一個(或多個) key ,若是在事務執行以前這個(或這些) key 被其餘命令所改動,那麼事務將被打斷。
下面咱們來看圖.
我還沒執行這些命令以前我根本不知道個人數據已經在被人修改了,當我要修改數據的時候已經被人先改了。
這時候咱們UNWATCH命令就派上用場了,至關於當我修改數據的時候我就把鎖加上,修改完成後就把鎖解開,讓下一我的繼續修改數據,
取消 WATCH 命令對全部 key 的監視,一旦咱們執行EXEC之後全部監控鎖都會被取消掉。
下面咱們來看圖
後面還會更新如何使用RedisTemplate來操做Redis命令,如何解決Redis穿透/雪崩等。
文章就寫到這裏了,若是文章有須要改進的地方請大佬們在評論區裏留言,謝謝點評。