redis事務原理和實踐

Redis事務的概念:

        Redis 事務的本質是一組命令的集合。事務支持一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會按照順序串行化執行隊列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
        總結說:redis事務就是一次性、順序性、排他性的執行一個隊列中的一系列命令。

Redis事務沒有隔離級別的概念:

        批量操作在發送 EXEC 命令前被放入隊列緩存,並不會被實際執行,也就不存在事務內的查詢要看到事務裏的更新,事務外查詢不能看到。
Redis不保證原子性:
        Redis中,單條命令是原子性執行的,但事務不保證原子性。事務中任意命令執行失敗,其餘的命令仍會被執行。當發生語法錯誤時,會直接丟棄。

Redis事務的三個階段

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

事務相關命令

  • multi : 標記一個事務塊的開始( queued )
  • exec : 執行所有事務塊的命令 (一旦執行exec後,之前加的監控鎖都會被取消掉 )
  • discard : 取消事務,放棄事務塊中的所有命令

Redis事務使用案例:

(1)正常執行
事務正常執行
在這裏插入圖片描述
在這裏插入圖片描述
事務未提交之前,獲取不到值,只有執行exec 提交事務之後,纔可以獲取到值
(2)放棄事務
在這裏插入圖片描述
執行discard之後,獲取不到值,我們可以得知,沒有插入redis
(3)命令錯誤
若在事務隊列中存在命令性錯誤(類似於java編譯性錯誤),則執行EXEC命令時,所有命令都不會執行
在這裏插入圖片描述
(4)語法錯誤
若在事務隊列中存在語法性錯誤(類似於java的1/0的運行時異常),則執行EXEC命令時,其他正確命令會被執行,錯誤命令拋出異常。
k2的值這個是字符串的,沒辦法自增,發生語法錯誤,但是其他命令執行成功
在這裏插入圖片描述
redis集羣是否支持事務?
單機是支持事務的,但是集羣原生不支持,配置lua腳本可以實現集羣事務。
在這裏插入圖片描述
我們可以看到事務還未提交,但是其他集羣,卻可以獲取到值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章