大家好,我是 31 歲、積極活潑、愛分享技術的小米,又來給你們搬運我社招面試中的真實經歷啦!

今天的小故事來自於上週五的一個下午。當時我正拎着一杯芋圓奶茶,在一個光線柔和的會議室裏,迎面坐着一個笑容温柔但眼神很專業的資深面試官。

他喝了一口美式,突然拋出一個看似輕飄飄的問題:

“小米,你給我説説,什麼是事務?還有,Redis 事務是怎麼實現的?三個階段是什麼?相關命令有哪些?”

那一刻我差點被芋圓噎住。不過沒關係,咱技術人越緊張越要穩住,我把奶茶放下,腦子裏以 5G 速度回放我踩過的坑,然後開始了我那套“奶茶事務”理論……

今天我就把當時的思考過程完整講給你聽,讓你以後面試再遇到這種題,不緊張,不慌張,一杯奶茶講給面試官聽就行。

故事開場:奶茶店裏的“事務”

我問面試官:“我能用個生活例子回答嗎?”

他點點頭。於是我説 :

想象你去奶茶店點了一杯 加珍珠、加芋圓但不要冰 的奶茶,這就是一個業務操作,包含多個步驟:

  1. 拿杯子
  2. 加珍珠
  3. 加芋圓
  4. 倒奶茶
  5. 封杯

這五步必須全部成功,你才能喝到那杯“米氏特調”。如果第三步“沒芋圓了”,那這一杯就不應該做出來,要直接整單作廢重新點。這其實就是:事務的本質(數據庫事務)

事務(Transaction)是一組要麼全部成功、要麼全部失敗的操作集合。

四大特性(ACID)也變得很好理解:

  • Atomicity(原子性):要麼五步都執行,要麼一杯都不做。
  • Consistency(一致性):不能出現“我沒加芋圓卻説給你加了”這種情況。
  • Isolation(隔離性):你點單的流程不應該被旁邊那位小姐姐點單的流程干擾。
  • Durability(持久性):一旦奶茶做完封好杯,就不能第二天突然沒了。

講到這,面試官笑了,説:“不錯,那你繼續講 Redis 事務。”於是我又喝了口奶茶,故事繼續。

故事第二幕:Redis 的“事務”和數據庫事務一點都不一樣

我接着講:

Redis 的事務更像是:

給奶茶店老闆報備要做哪幾步,但他不會幫你判斷中間有沒有芋圓,也不會在做的過程中幫你回滾,全靠你自己保證流程正確。

Redis 事務的本質其實只有兩點:

  • Redis 事務是命令的“批量順序執行”:你把一堆命令放進“隊列”,然後一次性提交。
  • Redis 事務不保證原子性(不支持回滾):只要命令語法正確,提交之後 Redis 就一個一個執行,執行失敗也不會回滾之前的命令。

面試官點點頭,表示認可。於是我繼續講 Redis 事務的三階段模型。

Redis 事務的“三個階段”:就像你點奶茶的完整流程

我把 Redis 事務比作一個點單流程,讓面試官更易理解。

第一階段:命令入隊(偏像你報備流程)

對應命令:MULTI

  • 你對老闆説:“我等下要做一杯奶茶,先不要急,聽我報操作。”
  • Redis 回你:OK,開始排隊吧。

此時所有後續命令都不會執行,而是進入隊列。

第二階段:命令排隊(往隊列裏塞命令)

例如你執行:

社招大廠高頻題:為什麼 Redis 事務不支持回滾?看這篇就夠!_Redis

Redis 不會執行,只會説:QUEUED(已排隊)

這就像你在告訴老闆:

  1. 先加珍珠
  2. 再加芋圓
  3. 再倒奶茶

老闆只負責記錄,不負責檢查你講的是不是廢話。

第三階段:執行事務(一次性全部提交)

使用命令:EXEC

Redis 開始按順序執行你排隊的所有命令。相當於你説:

“好了老闆,開始做!”

老闆照你説的流程一步步做。

特別注意:Redis 不支持回滾!

如果你的其中一步錯了,比如:

社招大廠高頻題:為什麼 Redis 事務不支持回滾?看這篇就夠!_回滾_02

只要不是語法錯誤,這個錯誤發生在執行期,Redis 不會停下,也不會回滾之前的操作。

  • 就像你跟老闆説:“先加珍珠,再加芋圓,再加冰塊。”
  • 結果你突然説:“哎呀我不喝冰的!”
  • 老闆會説:我已經加了冰,不退不改。

面試官繼續追問:“那 Redis 如何防止別人篡改數據?”

你以為事務講完就結束了嗎?

這時面試官又問我:

“如果在事務排隊階段,有其他客户端修改了我要操作的數據怎麼辦?”

我笑着説:“Redis 已經替你想到這一點了!”

於是我講了一個賣座的小故事:

Redis 的 WATCH:像貼在奶茶杯上的“封條”

你開始排隊點單時,你可以告訴老闆:“這個杯子貼上封條,別人不能動。”

Redis 的做法就是:

WATCH key1 key2 ...

它的意思是:我盯着這些 key,如果事務提交前它們被別人改了,我的事務就失敗。

比如:

客户端 A 執行:

社招大廠高頻題:為什麼 Redis 事務不支持回滾?看這篇就夠!_回滾_03

如果此時客户端 B 修改了 balance:

SET balance 9999

則 A 的 EXEC 會失敗:

(nil)

就像老闆發現有人撕開了封條,會告訴你:杯子被動過了,事務不能執行,你要不要重新來一杯?

這就是 Redis 樂觀鎖最經典的應用場景。

Redis 事務的全部命令總結(面試官最愛問)

為了讓面試官徹底滿意,我把所有命令一口氣總結:

社招大廠高頻題:為什麼 Redis 事務不支持回滾?看這篇就夠!_客户端_04

你只要把這些記住,面試現場絕對穩穩的。

講完故事後,面試官點頭了

講完以上內容後,面試官靠着椅背,看了我幾秒,然後説:

“小米你這個講奶茶的比喻挺有意思。邏輯清晰,場景化強,講明白了。”

然後他做了個讓我差點激動落淚的動作:在簡歷上寫了一個大大的 √ 。

那一刻我深吸一口氣,感覺奶茶又變甜了。

最後的總結(面試話術版)

如果你在面試時遇到同樣的問題,可以直接這樣回答:

1、什麼是事務?

事務是一組操作,要麼全部成功,要麼全部失敗,具有 ACID 特性。

2、Redis 事務的概念?

  • Redis 事務是通過將命令排隊並一次性順序執行,實現“批處理”的效果。
  • Redis 事務不支持自動回滾,只保證命令執行過程不會被其他客户端中斷。

3、Redis 事務的三個階段?

  1. MULTI 開啓事務
  2. 命令入隊並排隊
  3. EXEC 執行事務

4、Redis 事務相關命令?

  • MULTI
  • EXEC
  • DISCARD
  • WATCH
  • UNWATCH

END

希望今天的小故事,可以讓你在下一次面試時,不但答出 Redis 事務,還能答得又穩又好。

如果你喜歡我這種“講故事 + 奶茶類比”的技術分享方式,記得告訴我,我會繼續更新更多社招高頻題!

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!