TL;DR | 面試情境模擬 #
👴 面試官:Redis 到底是什麼?為什麼要用它?
🧑💻 你:Redis 是基於記憶體的 Key-Value database。因資料駐留在記憶體中,讀寫效能極高(微秒級),常被用作cache (Cache)、分散式鎖 (Distributed Lock) 或訊息佇列 (Message Queue),是用來幫傳統關聯式database(如 MySQL)減壓的神器。
為什麼需要 Redis?(架構優化與比喻) #
在現代後端架構中,Redis 的引入通常是為了解決 效能瓶頸 (Performance Bottleneck):
- 傳統database (MySQL - 倉庫):存儲量巨大,但每次讀寫都涉及磁碟 I/O,在大流量請求下,讀取延遲 (Latency) 較高,成為系統瓶頸。
- Redis (cache - 書桌):將「熱點數據 (Hot Data)」駐留在記憶體中,提供極低的存取延遲。透過把熱門資料放在書桌上,大幅降低了對後端database的讀取壓力,實現了請求的快速響應,提升系統併發能力 (Concurrency)。
💡 Redis 的核心技術重點 #
1. 為什麼快到不可思議? #
-
單執行緒模型 (Single-threaded) + IO 多工處理 (IO Multiplexing): Redis 的核心是一個 Event Loop (事件循環)。它利用
epoll等非阻塞 I/O 機制,在單執行緒中同時監控成千上萬個 Socket 連線。運作圖解:
[Client 1] \ [Client 2] -- [ Socket 監控 (epoll) ] -> [ Redis 單執行緒 Event Loop ] [Client 3] / (只處理就緒事件) (快速處理指令)- 深度解析:單執行緒避免了 CPU 頻繁切換 Context 的開銷,且不用處理複雜的「鎖 (Lock)」競爭。因為 CPU 在記憶體讀取上太快了,處理連線的network I/O 反而是瓶頸,IO Multiplexing 正是解決這個瓶頸的關鍵。
-
純記憶體操作:資料結構皆儲存在記憶體,讀寫速度比傳統硬碟database快數個數量級。
2. 除了cache,還能幹嘛?(結構化容器與應用場景) #
Redis 不只是簡單的 Key-Value (紙箱),它是「帶有收納功能的萬能工具箱」。傳統 KV 只能讀寫整塊資料,但 Redis 讓你直接對 Value 內部進行操作。
[圖解:傳統 KV vs. Redis 結構]
傳統 KV: [ Key ] -> [ 一坨資料 (String) ]
(改一點點也要全部取回,效率差)
Redis: [ Key ] -> [ 結構化容器 (Hash/List/Set...) ]
(直接操作容器內的某個欄位,效率極高)
常用結構與應用場景:
- String:適用於計數器、Token 儲存、Session。
- Hash:適用於存儲物件(如:使用者設定)。優勢:只讀取/修改物件中的特定欄位,而非整串字串。
- List:適用於訊息佇列。優勢:支援快速兩端推入 (Push)/彈出 (Pop)。
- Set:適用於去重、共同好友、追蹤清單。優勢:自動去重,且支援交集、聯集運算。
- ZSet (有序集合):適用於排行榜、延遲任務、計時器。優勢:根據分數 (Score) 自動排序,查詢極快。
💡 進階補充:常見追問 #
Q1:Redis 會不會掛掉後資料全沒? #
會,除非啟用persistence(RDB/AOF)。但即使啟用,它也主要定位在「cache」,database裡通常還是要有 MySQL 當作最終的備份與persistence儲存。
Q2:為什麼說它能當作「分散式鎖」? #
在分散式系統中,多個機器同時去搶同一個資源時,可以利用 Redis 的 SETNX 指令(如果沒人搶到就設值,搶到就執行)。因為 Redis 的執行是單執行緒且原子的,這確保了在多個節點環境下,只有一個節點能拿到鎖。