Đây là cold cache: toàn bộ traffic đang dựa vào cache đột ngột dồn xuống DB. Xử lý theo ba lớp:
1. Không để cache biến mất cùng deploy. Cache phải nằm ở tiến trình riêng (Redis) chứ không phải in-process trong app; restart app không được xoá cache. Nếu Redis phải restart, bật RDB để nạp lại dataset khi khởi động thay vì bắt đầu từ rỗng.
2. Chặn miss đồng loạt trên cùng một key. Khi n request cùng miss một key nóng, chỉ cho một request đi xuống DB, số còn lại chờ kết quả:
const lock = await redis.set('lock:' + key, '1', 'NX', 'EX', 10)
if (lock) {
const fresh = await loadFromDb(key)
await redis.set(key, JSON.stringify(fresh), 'EX', ttl)
return fresh
}
return await waitAndReadCache(key) // brief retry loop while the winner loadsỞ mức trong một process, có thể gom bằng single-flight (một promise dùng chung cho cùng key) trước khi chạm Redis.
3. Warm-up có kiểm soát. Sau khi dựng lại cache, nạp trước tập key nóng nhất (top sản phẩm, trang chủ, cấu hình) bằng một job chạy giới hạn tốc độ — và nhớ jitter TTL để chúng không cùng hết hạn về sau.
Cuối cùng: cần giới hạn tải xuống DB (connection pool cố định, timeout ngắn) để dù cold cache thì DB chỉ chậm chứ không bị quá tải dây chuyền.