1,概論
事物這東西相信大家都不陌生吧,在學習Spring,Mybatis等框架中,
只要是涉及到數據存儲和修改的,都會有事物的存在,
廢話就不多說了下面我們來簡單的介紹下Redis事物以及鎖。
2,Redis事物簡介?
Redis 事務可以一次執行多個命令, 並且我們來了解幾個重要的知識點:
- 開啟事物后,一切命令都會放入隊列當中,當執行EXEC以后才會挨個執行。
- 當執行EXEC命令后,如果隊列中有命令出錯,那么此隊列中的全部命令將不會執行(這里有兩種可能),后面會舉例介紹。
- 當事物執行以后,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
事物執行的三個階段:
- 開始事務。
- 命令入隊。
- 執行事務。
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穿透/雪崩等。
文章就寫到這里了,如果文章有需要改進的地方請大佬們在評論區里留言,謝謝點評。