Yêu cầu: từ URL dài tạo mã ngắn; truy cập mã ngắn → redirect tới URL gốc. Đặc thù: đọc nhiều hơn ghi rất nhiều, cần latency thấp, độ sẵn sàng cao.
Hướng thiết kế:
- Sinh mã: dùng base62 ([a-zA-Z0-9]) — 7 ký tự ≈ 3.5 nghìn tỉ tổ hợp. Cách sinh: (a) mã hóa một counter/ID tự tăng (dùng ID generator phân tán để tránh trùng), hoặc (b) hash + kiểm tra trùng. Tránh đoán được thứ tự nếu cần.
- Lưu trữ: bảng short_code → long_url — key-value/NoSQL hợp vì truy vấn đơn giản, ghi lớn; đánh index theo short_code.
- Đọc/redirect: cache nóng (Redis) cho mã phổ biến; trả 301/302 (302 nếu cần đếm click). Phục vụ qua nhiều app server stateless sau load balancer.
- Mở rộng: sharding theo short_code, thêm analytics (đếm click qua queue bất đồng bộ), custom alias, expiry.
Điểm hay bị hỏi: chống trùng mã, đọc-nặng nên cache/CDN, và trade-off 301 vs 302.