Redis & CDN (4/10): Cache-aside System Design cho ~1.000 user
Redis cache-aside, TTL, invalidation, CDN static, rate limit — giảm tải PostgreSQL khi redirect ShortLink tăng; xử lý hot key viral.
· 3 min read
Khóa học System Design cơ bản — thiết kế hệ thống scale 1 → 1 triệu user · Phần 4/10▼
Mục lục▼
Mục tiêu phần 4
Ở ~1.000 người dùng, redirect bắt đầu lặp lại cùng slug — database đọc nhiều hơn cần thiết. Phần này thêm Redis (cache-aside), CDN cho static, và rate limit — vẫn một app server.
Kiến trúc
Browser ──► CDN (static JS/CSS/img)
└──► Nginx ──► App ──► Redis (cache slug → url)
└──► PostgreSQL (source of truth)
| Component | Vai trò cụ thể |
|---|---|
| Redis | Giảm SELECT theo slug; chịu hot key viral |
| CDN | Cache file tĩnh gần user; giảm egress app |
| Nginx limit_req | Giới hạn POST tạo link theo IP |
| App | Logic cache-aside + invalidate |
Cache-aside — từng bước redirect
GET /:slug
1. key = "sl:" + slug
2. val = Redis GET key
3. if val is null:
row = DB SELECT target_url WHERE slug=?
if row missing → 404
Redis SET key JSON(row) EX 300
else parse val
4. (optional) record click — sync DB hoặc defer phần 6
5. HTTP 302 Location: target_url
| Quyết định thiết kế | Khuyến nghị ShortLink |
|---|---|
| TTL | 60–300 giây — cân bằng stale URL vs hit rate |
| Key naming | sl:{slug} — namespace tránh collision |
| Value | {"u":"https://...","v":3} — v tăng khi đổi URL để debug |
| Invalidate | DEL sl:{slug} ngay sau PATCH/DELETE |
| Thundering herd | Optional: lock ngắn khi miss (singleflight) |
Cache stampede (miss đồng loạt)
TTL hết cùng lúc → hàng trăm request cùng SELECT. Singleflight: request đầu giữ lock lock:sl:abc, các request khác chờ hoặc retry Redis sau 10ms.
CDN — cái gì đi CDN, cái gì không
| Đi | Không (hoặc TTL rất ngắn) |
|---|---|
/assets/*, favicon, marketing |
GET /:slug redirect động |
| Dashboard bundle JS/CSS | API JSON có auth |
Redirect có thể cache ở CDN chỉ khi URL ít đổi và bạn chấp nhận stale — thường không cache redirect toàn cầu ở giai đoạn 1K user.
Rate limiting
limit_req_zone $binary_remote_addr zone=create_link:10m rate=1r/s;
# burst cho phép nhịp ngắn
App-level: token bucket 60 POST / phút / IP + captcha nếu vượt ngưỡng 2 lần.
Hot key & memory Redis
Slug viral: một key nhận 5k GET/s — Redis single-thread vẫn thường đủ (in-memory). Ước lượng: 100k slug hot × 500 byte ≈ 50 MB — nhỏ.
Monitor: used_memory, evictions (nếu bật maxmemory-policy).
Checklist trước khi sang phần 5
- Hit rate cache > 90% trên redirect
- Alert Redis down → fallback đọc DB (degraded, chậm hơn)
- Document TTL và cách invalidate
Bài tập
- Peak 500 RPS read, hit rate 95% — DB chịu bao nhiêu RPS? (25)
- User đổi
target_url— liệt kê 3 bước bắt buộc để không redirect sai. - Vẽ sequence cache miss + singleflight.
Câu hỏi thường gặp
Phần 4 tập trung vào quy mô nào?
Redis cache-aside, TTL, invalidation, CDN static, rate limit — giảm tải PostgreSQL khi redirect ShortLink tăng; xử lý hot key viral.
Cache-aside khác write-through thế nào?
Cache-aside: app đọc cache trước, miss thì đọc DB rồi ghi cache. Write-through: mọi write ghi đồng thời DB và cache — đơn giản consistency nhưng write chậm hơn và cache chứa data ít dùng.
Bài đọc tiếp theo
Thiết kế hệ thống cơ bản (1/10): Học System Design — metric, QPS, CAP
System design là gì? Khóa miễn phí 10 phần: functional/non-functional, QPS, p99, availability, CAP — ước lượng traffic ShortLink scale 1→1M user. Bản đồ: /blog/hoc-system-design-co-ban-tu-dau
Đọc tiếp →Capstone URL shortener (10/10): System Design 1M MAU + rubric
Đề phỏng vấn URL shortener: 20k RPS redirect, 200 write/s, p99 & availability — rubric 100 điểm và đáp án tham khảo.
Đọc tiếp →Monolith System Design (2/10): Scale 1 user — kiến trúc MVP ShortLink
Thiết kế hệ thống giai đoạn MVP: monolith, Nginx, PostgreSQL một server — API URL shortener, schema SQL, sequence redirect, failure mode trước khi scale.
Đọc tiếp →Startup của bạn cần tech partner?
Trao đổi miễn phí về MVP, timeline và mô hình chia lợi nhuận phù hợp.