Cheatsheet: Caching căn bản: Redis, TTL và CDN cho người mới
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)
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)
This cheatsheet is premium content. Sign in and purchase the course to view the full content. Sign in