初學者指南:Redis 是什麼?完整介紹與應用解析

Published February 27, 2025 by 徐培鈞
資料庫

在現代的應用開發中,資料庫的性能往往是決定系統效能的關鍵因素。

無論是網站、手機應用程式,還是各種數據密集型應用,如何快速存取數據成為開發者最關心的問題之一。

這時候,Redis 便成為一個不可忽視的解決方案。

Redis 是一種高效的鍵值(Key-Value)資料庫,主要用於快取、會話管理、即時分析等場景。

它以極快的讀寫速度、豐富的資料結構、支援分散式與持久化等特性,成為許多開發者提升應用效能的重要工具。

本篇文章將詳細介紹 Redis 是什麼、其核心特性常見應用場景,以及如何開始使用 Redis,讓初學者也能輕鬆上手這款強大的資料庫技術。


什麼是鍵值(Key-Value)資料庫?

鍵值(Key-Value)資料庫是一種 NoSQL 資料庫類型,它的數據儲存方式非常簡單,類似於 字典(Dictionary)或哈希表(Hash Table)

每筆資料都有一個唯一的「鍵(Key)」,對應一個「值(Value)」

這種類型的資料庫擅長 高速讀取、寫入與擴展性,因此常用於快取系統、會話管理、即時數據處理等應用場景。

鍵值(Key-Value)資料庫的運作方式

鍵值資料庫的工作原理類似於一個 字典(Dictionary),舉個例子:

Value(值){"name": "Alice", "age": 25, "email": "alice@example.com"}
Value(值){"name": "Bob", "age": 30, "email": "bob@example.com"}

範例操作(以 Redis 為例)

存入資料

SET user:1001 '{"name": "Alice", "age": 25, "email": "alice@example.com"}'

取得資料

GET user:1001

返回結果

{"name": "Alice", "age": 25, "email": "alice@example.com"}

在這個例子中:

  • Key(鍵)"user:1001"
  • Value(值) 是一個 JSON 字串 {"name": "Alice", "age": 25, "email": "alice@example.com"}

這種存取方式非常快速,因為資料庫可以直接透過 Key 查找到對應的 Value,不需要像關聯式資料庫(SQL)一樣執行複雜的查詢。

鍵值資料庫 vs. 關聯式資料庫(SQL)

鍵值(Key-Value)資料庫Key-Value(鍵值對)
關聯式資料庫(SQL)表格(Table)、行列(Row-Column)
鍵值(Key-Value)資料庫透過 Key 直接查找
關聯式資料庫(SQL)使用 SQL 查詢(如 SELECT * FROM users WHERE id = 1001)
鍵值(Key-Value)資料庫易於水平擴展(Scaling Out)
關聯式資料庫(SQL)需透過分區(Sharding)或索引優化
鍵值(Key-Value)資料庫快取、Session 管理、排行榜、計數器
關聯式資料庫(SQL)結構化數據存儲、複雜查詢
鍵值(Key-Value)資料庫極快(O(1) 時間複雜度)
關聯式資料庫(SQL)需要索引或篩選條件查詢,速度較慢

鍵值(Key-Value)資料庫的特點

  1. 極快的讀寫速度(O(1) 時間複雜度)
    • 由於數據是根據 Key 直接存取,所以檢索速度極快,適合需要高性能的應用。
  2. 結構簡單,靈活性高
    • 只需存儲 Key-Value,無需定義固定的結構(不像 SQL 需要設計表格)。
  3. 高可擴展性
    • Key-Value 資料庫容易做 分布式擴展,適合大規模應用。
  4. 適合快取與即時數據處理
    • 由於 Key-Value 檢索速度快,常用於 快取(Cache)、Session 管理、計數器、分散式鎖 等場景。

常見的鍵值資料庫

主要特點高速記憶體儲存,支援持久化,支援多種數據結構
使用場景快取、即時數據、排行榜、Session 管理
主要特點亞馬遜 AWS 提供的 NoSQL 服務,可自動擴展
使用場景雲端應用、大規模數據存儲
主要特點用於分散式系統的 Key-Value 存儲,支援一致性協議
使用場景Kubernetes、配置管理
主要特點純記憶體快取,速度極快,但不支援持久化
使用場景快取、降低資料庫查詢負擔

MongoDB 是鍵值資料庫嗎?

MongoDB 屬於 NoSQL(非關聯式資料庫)的一種,但它不是純粹的鍵值資料庫(Key-Value Database)。MongoDB 更準確的分類是:

  • 文件型(Document-Oriented)資料庫,因為它存儲的是結構化的 JSON 文件(實際上是 BSON)。
  • 支援靈活的查詢,不像典型的 Key-Value 資料庫只能透過 Key 存取。

雖然 MongoDB 的資料以 JSON 格式 存儲,並且 JSON 內部確實包含 Key-Value 結構,例如:

{
  "_id": "12345",
  "name": "Alice",
  "age": 25,
  "email": "alice@example.com",
  "address": {
    "street": "123 Main St",
    "city": "New York"
  }
}

但 MongoDB 不只是透過「鍵」來存取「值」,它還支援:

  • 複雜的篩選與查詢(類似 SQL)db.users.find({ "name": "Alice" })
  • 索引(Indexing),加速查詢。
  • 嵌套結構與關聯,如 address 欄位內含多個鍵值。

MongoDB vs. 鍵值資料庫(Redis)的關鍵差異

MongoDB(文件型資料庫)JSON(BSON)文件
Redis / Key-Value 資料庫Key-Value(純鍵值存取)
MongoDB(文件型資料庫)可以根據 Key,也可以查詢特定欄位(如 name: "Alice")
Redis / Key-Value 資料庫只能透過 Key 存取
MongoDB(文件型資料庫)支援索引,查詢更快
Redis / Key-Value 資料庫不支援索引(通常用於快取)
MongoDB(文件型資料庫)支援(JSON 文件內可以包含其他 JSON)
Redis / Key-Value 資料庫不支援嵌套,只能用單純值或結構化資料(Hash、List)
MongoDB(文件型資料庫)適合儲存結構化/非結構化數據,如使用者資料、產品資訊
Redis / Key-Value 資料庫適合快取、排行榜、Session 管理、計數器

MongoDB vs. 純 Key-Value 資料庫

MongoDB 能根據欄位查詢,而 Key-Value 資料庫只能根據 Key 查找

  • MongoDB
db.users.find({ "name": "Alice" })  // 可以根據 name 查詢
  • Redis(或純 Key-Value DB)
GET user:1001  # 只能透過 Key 來存取,無法查詢內部欄位
  • 差異點:MongoDB 提供更靈活的查詢方式,而 Key-Value 資料庫只能根據 Key 取值。

MongoDB 支援嵌套結構,而 Key-Value 資料庫不支援

  • MongoDB(可以儲存嵌套的 JSON)
{
  "_id": "12345",
  "name": "Alice",
  "address": {
    "street": "123 Main St",
    "city": "New York"
  }
}
  • Redis(通常只能存儲單一值,無法存入複雜結構)
SET user:1001 "Alice"
  • 差異點:MongoDB 可用 JSON 儲存完整的文件,Key-Value 資料庫則通常只能存單一值或基本數據結構。

MongoDB 主要用於長期數據存儲,Key-Value 資料庫主要用於快取

  • MongoDB:儲存完整的應用數據,如使用者資訊、商品資訊、訂單記錄
  • Redis / Key-Value DB:適用於快取(Cache)、排行榜、Session 管理,如果系統重啟,可能會清除資料。

MongoDB 可以當作鍵值資料庫來使用嗎?

可以,但不建議!雖然 MongoDB 支援根據 _id 存取特定文件,類似於 Key-Value 存取方式:

db.users.findOne({ "_id": "12345" })

但如果你的需求只是 快取、Session 管理、排行榜、計數器,MongoDB 的效能不如 Redis,因為:

  • MongoDB 需要查詢與索引,這比直接存取 Key-Value 慢。
  • MongoDB 消耗更多存儲空間(BSON 格式比純 Key-Value 需要更多儲存空間)。
  • Redis 直接從記憶體讀取,速度比 MongoDB 快很多

Redis 是什麼?

Redis(Remote Dictionary Server,遠端字典伺服器)是一種開源的記憶體資料庫,主要用來存儲鍵值(Key-Value)對,並支援多種資料結構。

例如字串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)、哈希(Hash)等。

Redis 的基本特性

graph TD
  A[用戶請求] -->|查詢資料| B[應用伺服器]
  
  subgraph "快取層"
    C["Redis(記憶體快取)"]
  end
  
  subgraph "資料庫層"
    D["SQL 資料庫(如 MySQL, PostgreSQL)"]
  end

  B -->|先查詢快取| C
  C -- 有快取 --> B
  C -- 無快取 --> D
  D -->|回傳資料,並存入 Redis| C
  B -->|回應用戶| A
  • 基於記憶體運作,速度極快
    • Redis 主要將數據存放在 RAM 中,因此讀寫速度極快,相較於傳統關聯式資料庫(如 MySQL、PostgreSQL),它的效能可以提升數十倍甚至上百倍。
  • 支援多種資料結構
    • 除了基本的鍵值存儲,Redis 還支援 列表(List)、集合(Set)、有序集合(Sorted Set)、哈希(Hash),這讓它能夠適用於不同的應用場景。
  • 支援持久化機制
    • 雖然 Redis 是記憶體型資料庫,但它提供了 RDB(快照)AOF(追加式記錄) 兩種持久化機制,確保數據不會因為系統崩潰而完全丟失。
  • 支援分散式與叢集架構
    • Redis 原生支援 Master-Slave(主從)架構,並且提供 Redis Cluster,允許系統水平擴展,適應大規模應用需求。
  • 提供 Pub/Sub 訊息機制
    • Redis 內建 發佈/訂閱(Publish/Subscribe) 功能,可用於即時通訊、訊息佇列等應用。

Redis 的應用場景

由於 Redis 具備高效的讀寫速度與多樣化的資料結構,它在許多領域都有廣泛的應用,以下是一些最常見的 Redis 使用場景:

1. 快取(Cache)

Redis 最常見的用途之一就是作為快取,以減少資料庫查詢壓力,加快應用的響應時間。例如:

  • 網頁快取:將動態內容的計算結果暫存,提高網頁加載速度。
  • API 回應快取:對重複請求的 API 回應做暫存,降低伺服器負載。

2. 會話管理(Session Management)

許多網站使用 Redis 來存儲用戶的會話數據,因為它的內存存取速度快,能夠快速存取用戶登錄狀態、購物車等資訊。

3. 計數器與排名系統

Redis 的 原子性遞增/遞減(INCR/DECR) 操作非常適合計數應用,例如:

  • 網站瀏覽量統計
  • 用戶點擊數
  • 遊戲排行榜(使用有序集合 Sorted Set 來實現)

4. 分散式鎖(Distributed Lock)

在多伺服器環境下,Redis 可用來實現分散式鎖機制,確保多個應用程式不會同時修改同一份資料,避免競爭條件(Race Condition)問題。

5. 訊息佇列與即時通知

Redis 提供 Pub/Sub(發佈/訂閱)功能,可以用於即時通訊系統,如:

  • 聊天室訊息推送
  • 即時通知(如推播、訂單狀態變更)

Redis 與 MongoDB 的數據存儲方式

graph TD
  A[CPU] -->|快取數據| B(RAM 記憶體)
  A -->|指令與運算| B
  B -->|"存取快取/記憶體資料"| A
  B -->|載入應用程式數據| C(HDD/SSD 硬碟)

  %% Redis 運作於記憶體層級
  subgraph "記憶體(RAM)層"
    D["Redis(記憶體資料庫)"] -->|極高速存取| B
  end

  %% MongoDB 與 SQL 存儲於硬碟
  subgraph "硬碟(HDD/SSD)層"
    E["MongoDB(NoSQL 文件型資料庫)"] -->|讀取/寫入文件| C
    F["SQL 資料庫(如 MySQL, PostgreSQL)"] -->|讀取/寫入結構化數據| C
  end

  %% MongoDB 與 SQL 會透過快取加速存取
  B -->|載入快取數據| D

Redis:主要儲存在記憶體

Redis 是 記憶體型(In-Memory)資料庫,這意味著:

  • 數據主要存放在 RAM 中,這使得它的讀取速度極快(比傳統硬碟存取快上百倍)。
  • 但如果電腦斷電,未持久化的數據會丟失,所以 Redis 提供了 持久化機制(RDB & AOF)。

💡 Redis 如何決定數據存放位置?

  • 預設情況下,所有數據都存放在 RAM(記憶體)
  • 你可以開啟 RDB(快照)或 AOF(追加式記錄),這樣 Redis 會定期將數據存入硬碟:
    • RDB(Redis Database):定時將記憶體數據存入硬碟,減少 I/O 操作。
    • AOF(Append-Only File):每次有新數據時,會將變更記錄存入硬碟,確保數據不會丟失。

MongoDB:主要儲存在硬碟,但會使用記憶體快取

MongoDB 是 文件型 NoSQL 資料庫,它的數據主要存放在硬碟(Disk),但同時也會使用記憶體(RAM)來加速存取

💡 MongoDB 如何決定數據存放位置?

  • 預設情況下,所有數據都寫入 硬碟(Disk)
  • 但為了加速查詢,MongoDB 使用 內建的快取機制
    • 最近使用的數據會被載入記憶體(RAM),類似於作業系統的「頁面快取(Page Cache)」。
    • 當 MongoDB 需要存取數據時,會先檢查記憶體,如果數據已經載入,就不需要讀取硬碟,速度更快。
    • 如果記憶體不足,則會釋放舊數據,確保新數據能夠被載入。

👉 這樣的機制讓 MongoDB 既能保證數據長期存儲在硬碟,又能透過記憶體加速存取。

電腦如何知道應該用記憶體還是硬碟?

這其實是由 應用程式的設計 + 作業系統的記憶體管理機制 決定的。

📌 應用程式(MongoDB / Redis)會明確告訴作業系統該怎麼存儲數據

  • Redis 預設將所有數據存放在記憶體中,除非你開啟持久化,它才會將數據寫入硬碟。
  • MongoDB 預設將數據存入硬碟,但會讓作業系統幫忙「快取」熱數據到記憶體。

📌 作業系統的記憶體管理

  • 當應用程式需要大量記憶體時,作業系統會決定哪些數據應該保留在 RAM,哪些應該寫入硬碟。
  • 如果記憶體不夠,作業系統可能會使用「虛擬記憶體(Swap)」來將部分數據暫存到硬碟,但這會降低效能。

📌 安裝時不需要手動指定存放位置

  • 在安裝 Redis 或 MongoDB 時,不需要特別設定「這些數據要放 RAM,那些數據要放硬碟」,因為這是應用程式自動決定的。
  • 但是,你可以手動調整配置,例如:
    • 修改 Redis 設定檔 來開啟持久化(redis.conf
    • 調整 MongoDB 記憶體使用量 來最佳化效能(wiredTigerCacheSizeGB

總結

Redis記憶體(RAM)
MongoDB硬碟(Disk)
Redis是(可選 RDB / AOF)
MongoDB是(所有數據預設存於硬碟)
Redis主要儲存在記憶體,速度極快
MongoDB會使用記憶體作為快取,但數據長期存儲在硬碟
Redis是,預設在 RAM,開啟持久化後才寫入硬碟
MongoDB是,預設存硬碟,但會自動將熱數據載入 RAM
Redis可以設定 RDB/AOF
MongoDB可以調整快取大小(wiredTigerCacheSizeGB)

👉 結論

  • Redis:主要存放在記憶體,除非開啟持久化,否則數據不會寫入硬碟。
  • MongoDB:主要存放在硬碟,但會使用記憶體快取熱數據,加速讀取。
  • 作業系統不需要手動指定存放位置,應用程式會自動決定,但你可以調整配置來最佳化效能。

如何開始使用 Redis?

如果你是第一次接觸 Redis,可以透過以下步驟開始學習與實作:

安裝 Redis

Redis 支援多種作業系統,以下是安裝方式:

(1)Linux / macOS 安裝

# 使用 Homebrew 安裝(macOS)
brew install redis

# 使用 apt 安裝(Ubuntu)
sudo apt update
sudo apt install redis-server

# 啟動 Redis
redis-server

(2)Windows 安裝

官方不提供 Windows 版 Redis,但可以使用 WSL(Windows Subsystem for Linux) 或下載社群版 Redis。

連線 Redis

安裝完成後,可以使用 Redis CLI 進行測試:

redis-cli

然後嘗試執行以下指令:

SET name "Redis 初學者指南"
GET name

如果成功返回 "Redis 初學者指南",表示 Redis 正常運作!

基本指令介紹

Redis 的操作以 鍵值(Key-Value) 形式存儲數據,以下是一些基本指令:

說明設定鍵值對
說明取得指定鍵的值
說明刪除鍵
說明遞增數值
說明遞減數值
說明將值加入列表左側
說明將值加入列表右側
說明取出列表左側的值
說明取出列表右側的值

這些指令是 Redis 最基礎的操作,學會後可以進一步學習進階應用,如 Lua 腳本、Redis 叢集等。


結論

Redis 是一款高效、靈活且用途廣泛的記憶體資料庫,不論是作為快取、會話管理、計數器、排行榜、訊息佇列等場景,都是提升應用效能的利器。

對於初學者而言,理解 Redis 的核心概念、學習基本指令,並動手實作一些應用場景,是入門 Redis 最好的方式。

如果你正在尋找一款高性能的資料庫來優化系統效能,Redis 絕對值得學習與使用!

希望這篇指南能幫助你更快地掌握 Redis 的基礎知識,讓你在未來的開發中得心應手。