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

By Better Wise

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