NoSQL 核心分類
| 模型 | 代表產品 | 核心特點 | 適用場景 |
| 鍵值存儲 | Redis, Memcached, Tokyo Tyrant, ROMA, Flare | 極速讀寫、單鍵查詢、結構無感知 | 快取、Session、排行榜、計數器 |
| 文檔數據庫 | MongoDB, CouchDB | 無結構、嵌套文檔、豐富查詢、無 Join | 內容管理、日誌分析、產品目錄 |
| 列式數據庫 | Cassandra, HBase, Hypertable | 列族儲存、海量寫入、壓縮率高 | 時序數據、物聯網、大規模日誌 |
一、鍵值存儲 三種持久化策略
1. 臨時性:Memcached
- 純記憶體儲存,重啟即失效
- 讀寫微秒級,但容量受限於記憶體
- 適合:可重建的快取層 (DB 前端快取、頁面片段快取)
2. 永久性:Tokyo Tyrant, ROMA, Flare
- 資料落盤,重啟不丟失
- 性能遜於 Memcached (需磁碟 I/O),但可支援超大資料集
- 適合:需持久化的簡單鍵值業務 (用戶設定、Token 存儲)
3. 混合型:Redis (獨特優勢)
- 記憶體為主,非同步持久化到磁碟 (RDB 快照 + AOF 日誌)
- 觸發條件:預設 15 分鐘 1 次變更、5 分鐘 10 次、1 分鐘 10000 次
- 支援豐富資料結構:String, Hash, List, Set, Sorted Set, Bitmap, HyperLogLog, Stream
- 適合:高性能 + 持久化 + 複雜結構 (排行榜、佇列、分布式鎖、速率限制)
二、面向文檔數據庫 (MongoDB, CouchDB)
核心優勢
- 無 Schema:同一集合文檔結構可異,新增欄位無需 ALTER,敏捷開發友善。
- 豐富查詢:支援篩選、投影、排序、聚合管道、地理空間、全文搜索;雖無跨集合 Join 與多文檔 ACID 事務 (MongoDB 4.0+ 支援副本集事務),但覆蓋 90%+ 應用需求。
- 水平擴展:Sharding 自動分片,Replica Set 高可用。
文檔結構範例 (MongoDB)
{
_id: ObjectId("..."),
title: "Oracle 觸發器教學",
tags: ["Oracle", "PL/SQL", "Trigger"],
author: { name: "John", email: "john@example.com" },
stats: { views: 1234, likes: 56 },
comments: [
{ user: "Alice", text: "Great!", date: ISODate("2024-01-15") },
{ user: "Bob", text: "Thanks", date: ISODate("2024-01-16") }
]
}
三、面向列數據庫 (Cassandra, HBase, Hypertable)
行式 vs 列式 儲存對比
| 維度 | 行式 (傳統 RDBMS) | 列式 (NoSQL 列式) |
| 儲存單位 | 行 | 列 |
| 讀取模式 | 整行讀取 (OLTP) | 按需讀取特定列 (OLAP) |
| 壓縮率 | 低 (不同類型混存) | 極高 (同類型列連續、編碼壓縮) |
| 寫入性能 | 中等 (索引維護) | 極高 (LSM Tree 追寫) |
| Schema 變更 | ALTER TABLE (鎖表) | 動態新增列族/列 |
| 典型查詢 | 點查詢、範圍掃描 | 大範圍列聚合、時間序列 |
Cassandra 資料模型
Keyspace (≈ Database)
└── Table (Column Family)
├── Partition Key (決定分片)
├── Clustering Columns (決定分區內排序)
└── Columns (動態、稀疏)
-- 範例:時序感測器數據
CREATE TABLE sensor_data (
sensor_id UUID,
event_time TIMESTAMP,
temperature DOUBLE,
humidity DOUBLE,
PRIMARY KEY (sensor_id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);
選型決策樹
需要 ACID 事務、複雜 Join、強一致性?
├─ 是 → 關係型資料庫
└─ 否 →
數據結構簡單、極致讀寫速度、可容忍遺失?
├─ 是 → Memcached / Redis (快取)
├─ 否 →
需持久化鍵值、支援複雜結構 (List/Set/Sorted Set)?
├─ 是 → Redis
├─ 否 →
文檔結構多變、需豐富查詢、無 Join?
├─ 是 → MongoDB / CouchDB
├─ 否 →
海量寫入、時間序列、列聚合分析、需水平擴展?
├─ 是 → Cassandra / HBase
└─ 否 → 重新評估需求