【大廠面試】面試官都愛問的 Redis 事務

是什麼

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

能幹嘛

  • 一個隊列,一次性、順序性、排他性的執行一系列命令

怎麼玩

常用命令

// 取消事務,放棄執行事務塊內的所有命令
DISCARD
// 執行所有事務塊內的命令
EXEC
// 標記一個事務塊的開始
MULTI
// 取消 WATCH 命令對所有 key 的監視
UNWATCH
// 監視一個或多個 key,如果在事務執行之前這個(或這些)key 被其他命令所改動,那麼事務將被打斷。
WATCH key [key...]

Case1:正常執行

在這裏插入圖片描述

Case2:放棄事務

在這裏插入圖片描述

Case3:全體連坐

在這裏插入圖片描述

Case4:冤頭債主

在這裏插入圖片描述

Case5:watch 監控

悲觀鎖/樂觀鎖/CAS(Check And Set)

  • 悲觀鎖(Pessimistic Lock),顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候就會加上鎖,這樣別人想拿這個數據需要等到鎖結束才能拿到哦,傳統的關係型數據庫就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖
  • 樂觀鎖(Optimistic Lock),顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在次期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量。樂觀鎖策略:提交版本必須大於記錄當前版本才能執行更新

小總結

  • Watch 指令,類似於樂觀鎖,事務提交時,如果 Key 的值已被別的客戶端改變,比如某個 List 已被別的客戶端 push/pop 過了,整個事務隊列都不會被執行
  • 通過 WATCH 命令在事務執行之前監控了多個 keys,倘若在 WATCH 之後有任何 Key 的值發生了變化,EXEC 命令執行的事務都將被放棄,同時返回 Nullmulti-bulk 應答以通知者事務執行失敗

Redis 事務的 3個階段

  • 開啓:以 MULTI 開始一個事務
  • 入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務隊列裏面
  • 執行:由 EXEC 命令觸發事務

Redis 事務的 3個特性

  • 單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事物在執行的過程中,不會被客戶端發送來的命令請求所打斷
  • 沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執行,因爲事務提交前任何指令都不會被實際執行,也就不存在"事務內的查詢要看到事務裏的更新",在事務外查詢不能看到"這個讓人萬分頭痛的問題"
  • 不保證原子性:redis 同一個事務中如果有一條命令執行失敗,其後的命令仍會被執行,沒有回滾。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章