redis事務

小陳_winwah發表於2023-11-30

是什麼

可以一次執行多個命令,本質是一組命令的集合。一個事務中的所有命令都會序列化,按順序的序列化執行而不會被其他命令插入,不許加塞!

能幹嘛

在一個佇列中,一次性、順序性、排他性的執行一系列命令

Redis事務和資料庫事務的區別

  1. 單獨的隔離操作

    Redis的事務僅僅是保證事務裡的操作會被連續獨佔的執行,redis命令執行是單執行緒架構,在執行完事務內所有指令前是不可能再去同時執行其他客戶端的請求的

  2. 沒有隔離級別的概念

    因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務裡的更新,在事務外查詢不能看到”這種問題了

  3. 不保證原子性

    Redis的事務不保證原子性,也就是不保證所有指令同時成功或同時失敗,只有決定是否開始執行全部指令的能力,沒有執行到一半進行回滾的能力

  4. 排他性

    Redis會保證一個事務內的命令依次執行,而不會被其它命令插入

常用命令

  • DISCARD:取消事務,放棄執行事務塊內的所有命令。

  • EXEC:執行所有事務塊內的命令。

  • MULTI:標記一個事務塊的開始。

  • UNWATCH:取消WATCHMINGLING 對所有key的監視。

  • WATCH key [key...]:監視一個(或多個)key,如果在事務之前這個(或這些)key被其他命令所改動,那麼事務將被打斷。

案例

  • 正常執行

    image-20231130232902787

     

  • 放棄事務

    image-20231130233303399

  • 全體連坐

    image-20231130233423825

  • 冤頭債主(注意和傳統資料庫的區別,不一定要麼一起成功要麼一起失敗)

    image-20231130233518899

  • watch監控

    • redis使用watch來提供樂觀鎖定,類似於CAS(check-and-set)

    • watch:

      • 初始化k1和balance兩個key,先監控再開啟multi,保證兩key變動在同一個事物內

      image-20231130234536470

      • 加塞篡改

        watch命令是一種樂觀鎖的實現,Redis在修改的時候會檢測資料是否被更改,如果更改了,則執行失敗第一個視窗藍色框第5步執行結果返回為空,也就是相當於是失敗

        image-20231130234707799

       

    • unwatch:

      image-20231130234756459

    • 小結:

      一旦執行了exec之前加的監控鎖都會被取消掉

      當客戶端連線丟失的時候(比如退出連結),所有東西都會被取消監視。

小總結

開啟:MULTI開啟一個事物。

入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事物佇列裡面。

執行:由EXEC命令觸發事物。