事物這東西相信大家都不陌生吧,在學習spring,mybatis等框架中,
只要是涉及到資料儲存和修改的,都會有事物的存在,
廢話就不多說了下面我們來簡單的介紹下redis事物以及鎖。
redis 事務可以一次執行多個命令, 並且我們來了解幾個重要的知識點:
開啟事物後,一切命令都會放入佇列當中,當執行exec以後才會挨個執行。
當執行exec命令後,如果佇列中有命令出錯,那麼此佇列中的全部命令將不會執行(這裡有兩種可能),後面會舉例介紹。
當事物執行以後,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
事物執行的三個階段:
discard
取消事務,放棄執行事務塊內的所有命令。
exec
執行所有事務塊內的命令。
multi
開啟事物
unwatch
取消 watch 命令對所有 key 的監視。
watch key
監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
放棄事物,佇列裡面的命令將不會執行。
乙個命令出錯,佇列中的全部命令將不會執行。
這個例子跟上面的差不多,只不過這個例子是執行了以後再報錯,他兩不同的地方就是
上面是先知道錯誤,這個是執行後才知道錯誤了,舉個例子吧,
比如 我要讓我的redis資料數值增一操作,我在控制台執行命令,incr key 當事物還沒執行的時候,
也就是說這個命令還在佇列中,還沒執行,它是不知道我這個key到底是個數值還是個字串,
假設key不是個數值型別那麼當執行事物後,這條命令將會報錯,其他的命令正常執行。
我這裡就拿個花唄額度來舉例,假設我的balance為餘額,arrears為欠下的餘額,下面這張圖為
無加塞篡改,先監控在開啟multi,保證兩筆金額變動在同一事物內,一起執行。
類似於我在修改這個資料的時候,被其他使用者已經修改了,已經被加上鎖了,我自己就修改不了了,要等被人修改完才能夠修改,這跟上面的樂觀鎖很相似,
我開啟兩個控制台,乙個用來正常操作,乙個用來中途篡改資料。
watch 監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
下面我們來看圖.
我還沒執行這些命令之前我根本不知道我的資料已經在被人修改了,當我要修改資料的時候已經被人先改了。
這時候我們unwatch命令就派上用場了,相當於當我修改資料的時候我就把鎖加上,修改完成後就把鎖解開,讓下乙個人繼續修改資料,
取消 watch 命令對所有 key 的監視,一旦我們執行exec以後所有監控鎖都會被取消掉。
下面我們來看圖
後面還會更新如何使用redistemplate來操作redis命令,如何解決redis穿透/雪崩等。
Redis事務 樂觀鎖和悲觀鎖詳細介紹
mysql acid。要麼同時成功,要麼同時失敗。redis事務本質 一組命令的集合。乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性,順序性,排他性,執行一系列的命令。redis事務沒有隔離級別的概念 所有的命令在事務中,並沒有直接被執行。只有發起執行命令的時候才會執行。...
Redis 事務(悲觀鎖 樂觀鎖)
1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...
Redis鎖,悲觀鎖和樂觀鎖
樂觀鎖開啟事務前,設定對資料的監聽 watch exec時,如果發生資料發生過修改,作用於改資料的事務會自動取消 discard 事務exec後,無論成敗,監聽會被移除 悲觀鎖每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖。場景 如果專案中使用了快取且對快取設定了超時時間。當併發...