B13 · 快取策略 詳細 ROADMAP
計畫文件,不會被 Quartz 渲染。
回主 roadmap → backend/ROADMAP.md
章節目標
快取是後端效能救星,也是最多坑的地方。本章涵蓋快取層次 / patterns / 失效策略 / 熱點 key / 雪崩。Micro-service 系列有多篇實戰(33-cache-correct-usage、34-cache-antipatterns、27-queue-redis-coldstart),本章整合並擴展。
🌱 基本介紹
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 01 | 快取是什麼 | 01-what-is-cache | 🌱 | 時間 / 空間 trade-off、從 CPU cache 到 CDN 的光譜 |
❓ 為什麼需要
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 02 | 為什麼「加 cache」常常讓事情更糟 | 02-why-cache-makes-it-worse | 🌱 | 資料不一致、cache stampede、cache miss 比無 cache 更慢、debugging 複雜度 |
| 03 | 為什麼 cache invalidation 是 CS 兩大難題之一 | 03-why-cache-invalidation-hard | 🌱 | Phil Karlton 名言、TTL / event / tag 各自盲區、多層 cache 級聯失效 |
🕰️ 演進
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 04 | 快取技術演進 | 04-cache-evolution | 🌱 | Memcached(2003)→ Redis(2009)→ Redis Cluster / Sentinel → DragonflyDB / KeyDB(2022+) |
🧠 知識型
F13-A 層次與定位
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 05 | 快取層次 | 05-cache-layers | 🌱 | CPU cache → Process memory → Redis → CDN 各層特性 |
| 06 | Redis / Memcached | ⛔️ micro-service/20-storage-redis-es | 🌿 | 跨系列 |
| 07 | Redis 資料結構 | 07-redis-data-structures | 🌱 | String / Hash / List / Set / Sorted Set / Stream / Bitmap / HyperLogLog;用對能少寫很多 code |
| 08 | Redis 持久化(RDB / AOF) | 08-redis-persistence | 🌱 | RDB 快照 vs AOF 日誌;trade-off;混合模式 |
| 09 | Redis Cluster / Sentinel | 09-redis-ha | 🌱 | Sentinel 單 master 高可用 vs Cluster 分 slot;什麼時候升級 |
F13-B Cache Patterns
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 10 | Cache-Aside / Read-Through / Write-Through / Write-Behind | 10-cache-patterns | 🌱 | 四種主流模式的 trade-off、適用場景 |
| 11 | Refresh-Ahead | 11-refresh-ahead | 🌱 | 即將過期時背景刷新、避免 spike;複雜度高時機 |
| 12 | Cache 正確用法 | ⛔️ micro-service/33-cache-correct-usage | 🌿 | 跨系列 |
F13-C Invalidation
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 13 | TTL 策略 | 13-ttl-strategy | 🌱 | 固定 TTL / 隨機 TTL 避 avalanche / 基於業務的動態 TTL |
| 14 | Event-driven Invalidation | 14-event-invalidation | 🌱 | DB 更新 → 發 event → cache 失效;跟 Queue 整合 |
| 15 | Tag-based Invalidation | 15-tag-invalidation | 🌱 | 一組 key 的批次失效;Redis 沒有內建,怎麼實作 |
| 16 | Versioned Key | 16-versioned-key | 🌱 | user:123:v2,不刪舊 key、靠 version 切換 |
F13-D 災難模式
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 17 | Cache Stampede(雪崩) | 17-cache-stampede | 🌱 | 熱點 key 同時過期 → 大量 request 打 DB;locking / singleflight / 隨機 TTL 解法 |
| 18 | Hot Key 問題 | 18-hot-key | 🌱 | 單 key 過熱、Redis 單 thread 瓶頸;解法:本地 cache / replica read / key split |
| 19 | Cache Penetration(穿透) | 19-cache-penetration | 🌱 | 查不存在的 key 每次打 DB;bloom filter / 空值快取 |
| 20 | Cache Anti-patterns | ⛔️ micro-service/34-cache-antipatterns | 🌿 | 跨系列 |
F13-E 多層 Cache
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 21 | L1(本地記憶體)+ L2(Redis) | 21-multi-level-cache | 🌱 | Caffeine / node-cache / lru-cache 當 L1,Redis 當 L2;一致性策略 |
| 22 | CDN 作為最外層 Cache | 22-cdn-caching | 🌱 | Cache-Control / ETag / Surrogate-Control;跟 app cache 的分工 |
🔧 小實作注意事項
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 23 | 設計 CacheService 抽象層(proto 對照) | 23-design-cache-service | 🌱 | 可切換 backend(Redis / Memcached / in-memory)、enabled toggle、命名 convention;proto core/cache.py 案例 |
| 24 | Cache hit rate 監控 | 24-cache-metrics | 🌱 | hit / miss / eviction、Prometheus metrics、低 hit rate 的原因分析 |
💣 Anti-pattern
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 25 | 快取 Anti-patterns | 25-cache-antipatterns | 🌱 | 每個查詢都 cache(連查一次的都 cache)、TTL 訂無限大、cache 放敏感資料沒加密、不監控 hit rate、DB 跟 cache 沒一致性策略、忽視 cold start |
🧰 對應檢查工具
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 26 | 快取相關工具 | 26-cache-tooling | 🌱 | redis-cli、RedisInsight、Prometheus redis_exporter、MONITOR 指令、SLOWLOG |
📎 補充
| # | 主題 | Slug | Stage | 大綱 |
|---|
| S01 | DragonflyDB / KeyDB(Redis 替代) | s01-redis-alternatives | 🌱 | 多執行緒版 Redis、效能、遷移成本 |
| S02 | Materialized View 作為 cache | s02-materialized-view | 🌱 | DB 層 cache;refresh 策略 |
章節進度統計
- 知識主題:26 + 2 補充 = 28 項
- 🌿 growing:3(跨系列)
- 🌱 seed:25
跨系列連結
- →
micro-service/20、33、34、27
- →
backend/database/ B03(DB 層 cache / materialized view)
- →
backend/conventions/ B07 #9 CacheService
- →
backend/observability/ B17(cache metrics)
- →
backend/stress-testing/ B19(cache 壓測案例)