初學者指南:Redis 是什麼?完整介紹與應用解析
更新日期: 2025 年 3 月 4 日
本文為 NoSQL 基本介紹系列文,第 5 篇:
- SQL 與 NoSQL 的差異:新手指南
- MongoDB 入門指南:靈活高效的 NoSQL 資料庫
- 硬碟是什麼?從發展史到現代儲存技術的演變
- 記憶體是什麼?從發展史到現代電腦的核心元件
- 初學者指南:Redis 是什麼?完整介紹與應用解析 👈進度
在現代的應用開發中,資料庫的性能往往是決定系統效能的關鍵因素。
無論是網站、手機應用程式,還是各種數據密集型應用,如何快速存取數據成為開發者最關心的問題之一。
這時候,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)資料庫的特點
- 極快的讀寫速度(O(1) 時間複雜度)
- 由於數據是根據 Key 直接存取,所以檢索速度極快,適合需要高性能的應用。
- 結構簡單,靈活性高
- 只需存儲 Key-Value,無需定義固定的結構(不像 SQL 需要設計表格)。
- 高可擴展性
- Key-Value 資料庫容易做 分布式擴展,適合大規模應用。
- 適合快取與即時數據處理
- 由於 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
)
- 修改 Redis 設定檔 來開啟持久化(
總結
問題 | Redis | MongoDB |
---|---|---|
數據預設存放位置 | 記憶體(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 的基礎知識,讓你在未來的開發中得心應手。