🔴 Redis 入門:什麼是快取?為什麼需要 Redis?
📌 什麼是快取(Cache)?
想像你在圖書館找一本書:
- 沒有快取 = 每次都要到倉庫裡翻找,花很多時間
- 有快取 = 把常用的書放在桌上,隨手就能拿到
快取就是把經常存取的資料放在「更快的地方」,避免每次都去存取較慢的資料來源(如資料庫)。
為什麼需要快取?
使用者請求 → API Server → 資料庫查詢(慢!50ms+)
使用者請求 → API Server → 快取命中(快!<1ms)
| 情境 | 沒有快取 | 有快取 |
|---|---|---|
| 商品頁面載入 | 每次查 DB,50ms | 快取命中,<1ms |
| 首頁排行榜 | 聯合查詢,200ms | 快取命中,<1ms |
| 每秒 1000 請求 | DB 扛不住 | 快取擋住 90% |
📌 記憶體快取 vs 分散式快取
記憶體快取(In-Memory Cache)
// ASP.NET Core 內建的 IMemoryCache
builder.Services.AddMemoryCache();
public class ProductService
{
private readonly IMemoryCache _cache;
public ProductService(IMemoryCache cache)
{
_cache = cache;
}
public Product GetProduct(int id)
{
// 嘗試從快取取得
if (_cache.TryGetValue($"product:{id}", out Product product))
return product;
// 快取沒有,查資料庫
product = _db.Products.Find(id);
// 放入快取,5 分鐘過期
_cache.Set($"product:{id}", product, TimeSpan.FromMinutes(5));
return product;
}
}
限制: 只存在單一伺服器的記憶體中,多台伺服器之間不共享。
分散式快取(Distributed Cache)
Server A ─┐
Server B ─┼──→ Redis(共用快取)
Server C ─┘
優勢: 所有伺服器共享同一份快取,資料一致。
📌 Redis 是什麼?
Redis = Remote Dictionary Server(遠端字典伺服器)
- 開源的 記憶體資料結構儲存庫
- 支援多種資料型態(String、List、Hash、Set、Sorted Set)
- 單執行緒模型,避免鎖的問題
- 持久化支援(RDB / AOF)
- 支援主從複製、哨兵、Cluster
Redis vs Memcached 比較
| 特性 | Redis | Memcached |
|---|---|---|
| 資料型態 | 豐富(5+ 種) | 只有 String |
| 持久化 | 支援 RDB/AOF | 不支援 |
| 叢集 | 原生 Cluster | 客戶端分片 |
| Pub/Sub | 支援 | 不支援 |
| Lua 腳本 | 支援 | 不支援 |
| 記憶體效率 | 稍低 | 較高 |
| 多執行緒 | 單執行緒(6.0+ I/O 多執行緒) | 多執行緒 |
📌 Redis 安裝(Docker 方式)
# 拉取 Redis 映像
docker pull redis:latest
# 啟動 Redis 容器
docker run -d --name my-redis \
-p 6379:6379 \
redis:latest
# 驗證 Redis 是否運行
docker exec -it my-redis redis-cli ping
# 回應: PONG
Docker Compose 版本
# docker-compose.yml
version: '3.8'
services:
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes
volumes:
redis-data:
📌 Redis CLI 基本操作
# 連線到 Redis
docker exec -it my-redis redis-cli
# SET:設定鍵值
SET mykey "Hello Redis"
# OK
# GET:取得值
GET mykey
# "Hello Redis"
# DEL:刪除鍵
DEL mykey
# (integer) 1
# KEYS:列出所有符合的鍵(生產環境慎用!)
KEYS *
KEYS user:*
# EXISTS:檢查鍵是否存在
EXISTS mykey
# (integer) 0
# TTL:查看剩餘存活時間
SET session:abc "data" EX 60
TTL session:abc
# (integer) 58
📌 Redis 適用場景
| 場景 | 說明 | 使用的資料型態 |
|---|---|---|
| Session 儲存 | 分散式 Session 管理 | String / Hash |
| 排行榜 | 遊戲分數、熱門文章 | Sorted Set |
| 計數器 | 按讚數、瀏覽次數 | String (INCR) |
| 訊息佇列 | 非同步任務處理 | List / Stream |
| 即時通訊 | 聊天室、通知推送 | Pub/Sub |
| 限流 | API Rate Limiting | String (INCR + EXPIRE) |
| 地理位置 | 附近的人、店家搜尋 | Geo |
🔑 重點整理
- 快取是把常用資料放在更快的存取層,減少 DB 壓力
- 記憶體快取只在單機有效,分散式快取多台伺服器共享
- Redis 是最流行的分散式快取,支援豐富資料型態
- 用 Docker 可以快速啟動 Redis 開發環境
- Redis CLI 的 SET/GET/DEL/KEYS 是最基本的操作