Redis、Memcached、MySQL 三者在現代架構中扮演不同角色。本文從 Schema 設計、容量帶寬規劃、QPS 擴展策略、可擴展性模式四個維度深度對比,揭示 Redis 同時具備 MySQL 持久化特性與 Memcached 高速快取特性的雙重基因,並探討 Redis 分庫分表設計模式。
| 維度 | MySQL | Memcached | Redis |
|---|---|---|---|
| 核心定位 | 關係型持久化數據庫 | 純記憶體分佈式快取 | 記憶體數據結構存儲 (持久化可選) |
| Schema 設計 | **強制預設計** (DDL) | **無 Schema** (Key-Value) | **半結構化**:大型項目需預規劃 Key 結構、類型、大小、增長 |
| 數據結構 | 表/行/列 | String | String, Hash, List, Set, Sorted Set, Bitmap, HyperLogLog, Stream |
| 持久化 | 完整 ACID | 無 | RDB/AOF 可選,非強一致 |
| 查詢語言 | SQL | 簡單 GET/SET | 指令式 (類 DSL) |
雖然 Redis 無強制 Schema,但受限於**物理記憶體容量硬上限**,必須預先規劃:
這本質上就是**容量規劃 Schema**,由數據架構師負責,類似 MySQL 分表預案。
| 指標 | MySQL | Memcached | Redis |
|---|---|---|---|
| 容量上限 | 磁碟大小 (TB 級) | 物理記憶體 | 物理記憶體 (單實例建議 < 64GB) |
| 帶寬壓力 | 中等 (SQL 解析開銷) | 高 (純網絡 IO) | **極高** (單機 10W+ QPS,需萬兆網卡) |
| 網絡協議 | MySQL 協議 | 文本/二進制 | RESP 協議 (二進制安全) |
關鍵洞察:Redis 效能比 MySQL 高 10 倍+,**帶寬往往成為瓶頸而非 CPU**,部署時必須規劃網絡帶寬冗餘。
| 場景 | MySQL | Memcached | Redis |
|---|---|---|---|
| 寫入擴展 | 分庫分表 (Sharding) | Client 端 Hash 分片 | **分片 (Redis Cluster) / 代理中間件** |
| 讀取擴展 | 1. 分片 2. 讀寫分離 (Replica) | Hash 分片 | 1. 分片 2. **讀寫分離 (Replica)** 3. 只讀副本 |
Redis **完美繼承了 MySQL 的「讀寫分離 + 分片」雙擴展模式**,同時具備 Memcached 的 **Client Hash 分片** 簡單模式。
| 模式 | MySQL | Memcached | Redis |
|---|---|---|---|
| 垂直擴展 | 升級硬體 | 增加記憶體 | 增加記憶體 (受限於單線程) |
| 水平擴展 | 分庫分表 (中間件/應用層) | 一致性 Hash / Ketama | **Redis Cluster (原生槽位分片)** / 代理 / Client Hash |
| 高可用 | MHA/Orchestrator/Group Replication | 無原生 HA (應用層容錯) | **Sentinel / Cluster 內建故障轉移** |
原文提出開放問題:Redis 中「分庫分表」如何實現?有什麼好的設計模式?
CRC16(key) % 16384 映射 Slot{tag} 強制同槽user:{id} → Cluster A,order:{id} → Cluster B| 場景 | 首選 | 理由 |
|---|---|---|
| 關係型業務、事務、複雜查詢、持久化 | MySQL | ACID、SQL、生態成熟 |
| 純快取、Session、簡單 KV、數據可丟失 | Memcached | 極簡、多線程、穩定 |
| 豐富數據結構、排行榜、計數器、佇列、發布訂閲、需持久化 | Redis | 數據結構豐富、單線程無鎖、生態豐富 |
| 高併發讀寫、需 HA、自動分片 | Redis Cluster | 原生分片+HA、線性擴展 |
Redis 是**介於 MySQL 與 Memcached 之間的混合體**:擁有 MySQL 級的持久化選項、複製架構、分片擴展模式,又具備 Memcached 級的記憶體速度、簡單協議。**容量規劃 Schema、帶寬預留、分片策略預案**是 Redis 生產化的三大必修課。選型時不必二元對立,**MySQL 做持久化主存、Redis 做熱數據加速、Memcached 做純快取** 三者共存是常見最佳架構。