Thời lượng: 25 phút
Level: Advanced
Yêu cầu: Đã hiểu về luồng đi của một request từ Client đến Database.
Mục tiêu bài học
Sau bài học này, bạn sẽ:
- Phân biệt các lớp Caching: Client-side, CDN và Server-side.
- Sử dụng đúng HTTP Caching Headers (Etag, Cache-Control).
- Nắm vững cơ chế Invalidation (Xóa cache) khi dữ liệu thay đổi.
Nội dung chính
1. Tại sao cần Caching?
Dữ liệu trong Database thay đổi ít hơn rất nhiều so với số lần nó được đọc. Thay vì bắt Database tính toán lại cùng một kết quả hàng triệu lần, chúng ta lưu kết quả đó vào một bộ nhớ nhanh (RAM).
Caching giúp:
- Giảm độ trễ (Latency).
- Tiết kiệm chi phí vận hành server.
- Tăng khả năng chịu tải (Scalability).
2. Các lớp Caching chuẩn Design System
A. Client-side Cache (Browser/Mobile)
Sử dụng Header Cache-Control.
max-age=3600: Client tự lưu kết quả trong 1 giờ, không thèm hỏi server.no-cache: Client phải hỏi server xem dữ liệu đã cũ chưa (dùng Etag).
B. CDN Cache (Edge Computing)
Dành cho dữ liệu tĩnh hoặc dữ liệu công khai (VD: List sản phẩm, bài viết blog). CDN (Cloudflare, CloudFront) sẽ trả về dữ liệu ngay tại vị trí gần người dùng nhất.
C. Server-side Cache (Redis/Memcached)
Dành cho dữ liệu nghiệp vụ phức tạp hoặc kết quả các phép tính nặng.
- Cache-aside Pattern: Code check trong Redis -> Không có thì query DB -> Lưu vào Redis -> Trả về.
3. Vấn đề khó nhất: Cache Invalidation
"Chỉ có hai thứ khó trong lập trình: Đặt tên biến và Xóa cache" - Phil Karlton.
Chiến lược xóa cache:
- TTL (Time To Live): Tự động hết hạn sau X giây. Đơn giản nhất nhưng dữ liệu có thể bị cũ trong một khoảng thời gian.
- Event-based: Khi Admin cập nhật sản phẩm -> Xóa key cache của sản phẩm đó ngay lập tức.
Nguyên tắc then chốt
"Đừng bao giờ cache dữ liệu nhạy cảm hoặc cá nhân hóa của user ở lớp CDN public."
Nếu bạn cache GET /profile ở CDN, người dùng A có thể nhìn thấy thông tin của người dùng B. Luôn dùng private trong Cache-Control cho dữ liệu cá nhân.
Thực hành
Bài tập 1: Thiết kế Header cho API "Danh sách Tỉnh thành"
Bối cảnh: Danh sách tỉnh thành của Việt Nam hầu như cả năm mới thay đổi một lần.
Yêu cầu:
- Thiết kế
Cache-Controlheader phù hợp. - Bạn nên cache ở lớp nào là hiệu quả nhất?
Xem đáp án mẫu
- Header:
Cache-Control: public, max-age=31536000(Cache 1 năm). - Lớp cache: CDN là hiệu quả nhất. Mọi người dùng trên thế giới sẽ nhận được dữ liệu từ node gần họ nhất mà server của bạn không tốn một giọt mồ hôi nào.
Tình huống thực tế
Scenario 1: Flash Sale sập hệ thống
Bối cảnh: Đúng 12h trưa, 1 triệu người cùng nhấn vào trang chi tiết sản phẩm iPhone 15 giá 1k. Database sập ngay lập tức vì không chịu nổi nhiệt.
Giải quyết: Đây là tình huống Cache Stampede.
- Sử dụng lớp CDN cực mạnh để gánh toàn bộ lượt view.
- Tại server, dùng kỹ thuật Locking/Single Flight: Nếu 1000 request cùng hỏi một key chưa có trong cache, chỉ cho phép 1 request đi vào DB, 999 ông còn lại đứng đợi kết quả từ ông thứ 1.
Câu hỏi phỏng vấn
Senior Level
- Q: Phân biệt
Stale-while-revalidatetrong Caching? A: Đây là một chiến lược UX tuyệt vời. Server trả về dữ liệu cũ (Stale) ngay lập tức để user không phải đợi, đồng thời âm thầm gọi xuống DB để lấy dữ liệu mới và cập nhật cache cho lần sau. User luôn thấy app nhanh "như điện".
Tóm tắt
Những điều cần nhớ
- Dùng
Cache-Controlđể điều khiển Browser và CDN. - Redis dành cho dữ liệu nghiệp vụ và session.
- Luôn cẩn trọng với việc cache dữ liệu cá nhân (Private data).
Bước tiếp theo
Trong bài tiếp theo, bạn sẽ học về Lesson 7.2: Rate Limiting - Cách ngăn chặn các request xấu và bảo vệ tài nguyên hệ thống.