快轉到主要內容
  1. Core/

Redis 是什麼?|比喻與面試秒答

Idle Engineer
作者
Idle Engineer
AI Runs. I Nap. | 404 Career Not Found
目錄

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 的執行是單執行緒且原子的,這確保了在多個節點環境下,只有一個節點能拿到鎖。