首頁  >  文章  >  資料庫  >  redis事務使用案例分享

redis事務使用案例分享

王林
王林轉載
2021-01-30 09:25:241878瀏覽

redis事務使用案例分享

首先我們來簡單介紹下redis事務的本質:

  Redis 事務的本質是一組指令的集合。事務支援一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會依照順序串列化執行佇列中的命令,其他客戶端提交的命令請求不會插入到交易執行命令序列中。

  總結說:redis事務就是一次性、順序性、排他性的執行一個佇列中的一系列命令。

Redis交易沒有隔離等級的概念:

  批次操作在發送EXEC 指令前被放入佇列緩存,並不會被實際執行,也就不存在事務內的查詢要看到事務裡的更新,事務外查詢不能看到。

Redis不保證原子性:

  Redis中,單一指令是原子性執行的,但事務不保證原子性,且沒有回滾。事務中任意指令執行失敗,其餘的指令仍會被執行。

Redis事務的三個階段:

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

Redis事務相關命令:

  watch key1 key2 ... :監視一或多個key,如果在事務執行之前,被監視的key被其他命令改動,則事務被打斷( 類似樂觀鎖)

  multi : 標記一個事務塊的開始( queued )

  exec : 執行所有事務區塊的命令( 一旦執行exec後,先前加的監控鎖定都會被取消掉) 

  discard : 取消事務,放棄事務區塊中的所有指令

  unwatch : 取消watch對所有key的監控

Redis事務使用案例:

(1)正常執行

redis事務使用案例分享

( 2)放棄交易

redis事務使用案例分享

(學習影片分享:redis影片教學

(3)若在交易佇列中存在指令性錯誤(類似java編譯性錯誤),執行EXEC指令時,所有指令都不會執行

redis事務使用案例分享

(4)若在交易佇列中存在語法錯誤(類似java的1/0的執行時期例外),則執行EXEC指令時,其他正確指令會被執行,錯誤指令拋出例外。

redis事務使用案例分享

(5)使用watch

案例一:使用watch偵測balance,交易期間balance資料未變動,交易執行成功

redis事務使用案例分享

案例二:使用watch偵測balance,開啟交易後(標註1處),在新視窗執行標註2中的操作,更改balance的值,模擬其他客戶端在事務執行期間更改watch監控的數據,然後再執行標註1後指令,執行EXEC後,事務未成功執行。

redis事務使用案例分享

一但執行 EXEC 開啟交易的執行後,無論交易使用執行成功, WARCH 對變數的監控都會被取消。

故當交易執行失敗後,需重新執行WATCH指令對變數進行監控,並開啟新的交易進行操作。

 總結:

  watch指令類似於樂觀鎖,在交易提交時,如果watch監控的多個KEY中任何KEY的值已經被其他客戶端更改,則使用EXEC執行事務時,事務佇列將不會被執行,同時傳回Nullmulti-bulk應答以通知呼叫者事務執行失敗。

相關推薦:redis資料庫教學

以上是redis事務使用案例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除