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

更新日期: 2025 年 3 月 4 日

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

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

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

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

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

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


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

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

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

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

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

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

Key(鍵)Value(值)
"user:1001"{"name": "Alice", "age": 25, "email": "[email protected]"}
"user:1002"{"name": "Bob", "age": 30, "email": "[email protected]"}

範例操作(以 Redis 為例)

存入資料

SET user:1001 '{"name": "Alice", "age": 25, "email": "[email protected]"}'

取得資料

GET user:1001

返回結果

{"name": "Alice", "age": 25, "email": "[email protected]"}

在這個例子中:

  • Key(鍵)"user:1001"
  • Value(值) 是一個 JSON 字串 {"name": "Alice", "age": 25, "email": "[email protected]"}

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

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

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

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

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

常見的鍵值資料庫

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

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": "[email protected]",
  "address": {
    "street": "123 Main St",
    "city": "New York"
  }
}

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

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

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

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

總結

問題RedisMongoDB
數據預設存放位置記憶體(RAM)硬碟(Disk)
是否支援持久化?是(可選 RDB / AOF)是(所有數據預設存於硬碟)
如何使用記憶體?主要儲存在記憶體,速度極快會使用記憶體作為快取,但數據長期存儲在硬碟
應用程式是否自動決定存放位置?是,預設在 RAM,開啟持久化後才寫入硬碟是,預設存硬碟,但會自動將熱數據載入 RAM
能否手動調整?可以設定 RDB/AOF可以調整快取大小(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) 形式存儲數據,以下是一些基本指令:

指令說明
SET key value設定鍵值對
GET key取得指定鍵的值
DEL key刪除鍵
INCR key遞增數值
DECR key遞減數值
LPUSH list value將值加入列表左側
RPUSH list value將值加入列表右側
LPOP list取出列表左側的值
RPOP list取出列表右側的值

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


結論

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

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

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

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

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *