# 🗄️ Cheatsheet: Caching căn bản: Redis, TTL và CDN cho người mới

By Better Wise

> This cheatsheet is premium content. Sign in and purchase the course to view the full content.

> **Note:** 
> Cheatsheet tra cứu nhanh cho toàn khóa. Câu hỏi gốc luôn là: **"Dữ liệu này cũ bao lâu thì chấp nhận được?"**

---

## 1. Cache là gì và khi nào nên dùng

**Cache = bản sao dữ liệu ở nơi đọc nhanh hơn nguồn gốc.** Mỗi lần không tìm thấy trong cache gọi là **cache miss**.

Ví dụ tủ lạnh: bạn không ra chợ (database) mỗi lần muốn uống sữa, bạn mở tủ lạnh (cache). Nhưng sữa trong tủ có hạn (TTL), và nếu ai đó thay sữa ở chợ thì tủ lạnh của bạn vẫn cũ (stale).

### Khi nào NÊN dùng cache

| Tín hiệu | Vì sao |
| --- | --- |
| Đọc nhiều, ghi ít (read-heavy) | Tỉ lệ hit cao, ít phải invalidate |
| Dữ liệu tính toán đắt (query nặng, join nhiều bảng) | Trả lại kết quả đã tính, tiết kiệm CPU/DB |
| Dữ liệu ít thay đổi (config, danh mục, profile) | Ít rủi ro stale |
| Chịu được dữ liệu cũ vài giây/vài phút | Đơn giản hóa invalidation |
| Static assets (ảnh, JS, CSS, font) | CDN cache gần người dùng |

### Khi nào KHÔNG nên (hoặc cẩn thận)

| Tình huống | Lý do |
| --- | --- |
| Ghi nhiều hơn đọc | Cache liên tục bị invalidate, gần như vô dụng |
| Dữ liệu phải chính xác tuyệt đối (số dư, tồn kho giao dịch) | Stale gây sai nghiệp vụ |
| Dữ liệu cá nhân hóa theo từng user, không lặp lại | Tỉ lệ hit thấp, tốn bộ nhớ |
| Chưa đo được điểm nghẽn | Tối ưu mù, thêm phức tạp không cần thiết |

> **Tip:** 
> Trước khi cache, hãy đo. Cache che giấu vấn đề hiệu năng chứ không sửa nguyên nhân gốc.

---

## 2. Cache-aside: luồng đọc ghi

Mẫu phổ biến nhất: ứng dụng tự quản lý cache, cache **không** tự nói chuyện với DB.

### Luồng ĐỌC (read path)

```mermaid
flowchart TD
    Req["📥 Request đọc"] --> Get["🔍 Cache GET key"]
    Get --> Hit{"Có trong cache?"}
    Hit -->|"Hit"| Return["✅ Trả dữ liệu từ cache"]
    Hit -->|"Miss"| DB["🗄️ Query database"]
    DB --> Set["💾 Cache SET key (kèm TTL)"]
    Set --> Return2["✅ Trả dữ liệu cho client"]
```

- **Hit**: trả ngay từ cache, không chạm DB.
- **Miss**: đọc DB, ghi lại vào cache kèm TTL, rồi trả về.

### Luồng GHI (write path)
