Redis 介紹
· 6 min read
Redis(Remote Dictionary Server)把資料放在記憶體裡,用微秒級讀寫支援快取、計數與排行榜這類高併發場景。
Redis 是什麼
Redis 是開源的、基於記憶體(In-memory)的鍵值對(Key-Value)資料庫。它通常被用作資料庫、快取(Cache)和訊息代理(Message Broker)。資料主要存在記憶體中,讀寫很快,是目前常見的 NoSQL 選擇之一。
核心特性
極致效能
Redis 將資料存在記憶體中,讀寫通常落在微秒級,適合對回應時間很敏感的應用。代價是資料量受實體記憶體限制,擴充成本比磁碟型資料庫高。
豐富的資料結構
它不只是單純的字串鍵值,還內建多種結構,讓常見需求不必自己在應用層組裝。
| 類型 | 特性 | 常見用途 |
|---|---|---|
| String(字串) | 文字、數字或二進位資料 | 快取、計數器 |
| List(列表) | 依插入順序排列的字串列表(Linked List) | 佇列(Queue) |
| Set(集合) | 無序、元素唯一 | 去重、標籤 |
| Hash(雜湊) | 一個 key 底下的欄位集合 | 存物件 |
| Sorted Set(ZSet) | 每個元素帶一個分數(Score)並依分數排序 | 排行榜 |
| 進階類型 | Bitmap、HyperLogLog、Geospatial | 位元統計、基數估計、地理位置 |
持久化(Persistence)
主資料在記憶體,但 Redis 可以把資料寫到硬碟,避免程序重啟後全部消失。兩種機制可以單獨開,也可以一起用。
| RDB(Redis Database Backup) | AOF(Append Only File) | |
|---|---|---|
| 做法 | 定期把記憶體做成快照(Snapshot) | 把每次寫入追加進日誌 |
| 恢復 | 直接載入快照,通常較快 | 重放日誌,較接近當機前的狀態 |
| 取捨 | 兩次 快照之間的寫入可能丟失 | 檔案較大,重放較久 |
當機時會不會丟資料,取決於採用哪一種持久化、以及寫入磁碟的頻率。
單執行緒模型
核心的網路 I/O 與鍵值讀寫由一個主執行緒處理。少了多執行緒的上下文切換(Context Switching)和鎖競爭,命令執行順序也比較好推理。
Redis 6.0 起可以用多執行緒處理網路 I/O,執行命令仍然是單執行緒。
高可用與分散式
- Replication(主從複製):Master-Replica 架構,用來做讀寫分離與備份。
- Sentinel(哨兵):監控 Master,Master 失效時自動故障轉移(Failover)。
- Cluster(叢集):自動分片(Sharding),把資料攤到多個節點做水平擴展。
常見應用場景
- 快取(Caching):擋在 MySQL 這類資料庫前面,減輕讀取壓力。
- Session 儲存:多個服務實例共用同一份登入狀態。
- 排行榜:用 Sorted Set 依分數即時排序。
- 計數器:用原子指令
INCR累加播放量、按讚數。 - 訊息隊列:用 List,或 Pub/Sub(發布/訂閱)做簡單的非同步傳遞。
- 分散式鎖:多個服務實例協調對同一份資源的存取。
基本指令範例
以下是 redis-cli 裡最常用的幾類操作。字串用來存值與計數,List 的左右推入可以當成佇列,Hash 則用來存一筆物件的多個欄位。
# 字串操作
SET name "Antigravity"
GET name
# 輸出: "Antigravity"
# 計數
SET visits 10
INCR visits
# 輸出: 11
# 列表操作(作為 Queue)
LPUSH myqueue "task1"
LPUSH myqueue "task2"
RPOP myqueue
# 輸出: "task1"
# Hash 操作(儲存物件)
HSET user:1001 name "John" age 30
HGETALL user:1001
# 輸出: name "John" age 30
優缺點
優點
- 速度快:記 憶體操作,延遲低。
- 功能集中:多種資料結構,再加上 Lua script、Transaction 等,很多模式不用另接一套中介軟體。
- 客戶端齊全:主流語言都有 client,文件也完整。
缺點
- 記憶體受限:資料量受實體記憶體大小限制,成本較高。
- 持久化有窗口:當機時仍可能丟掉最後一段寫入,丟多少取決於 RDB/AOF 的設定。
GUI
本機除錯時可以用圖形客戶端看 key 與結構。Another Redis Desktop Manager 是其中一個選擇。
總結
Redis 用記憶體換速度,並用 String、List、Hash、Sorted Set 這些結構覆蓋快取、計數、佇列與排行榜。要上線時,再依資料能不能丟,決定 RDB、AOF,以及要不要加 Sentinel 或 Cluster。