Cache không chữa được query sida – tối ưu DB trước rồi hãy gọi tên Redis
Nhiều người vội cache cho nhanh, nhưng làm vậy chỉ “vá tạm”. Thứ cần làm trước là tối ưu database: thêm index, chỉnh query, giảm thời gian từ vài giây xuống vài chục mili giây.
Vấn đề không nằm ở code – mà nằm ở DB
Chuyện là app chạy chậm như rùa lết. Người dùng phải chờ 3–5 giây để load một trang. Bạn soi log, soi code, soi từng dòng middleware, nhưng chẳng có lỗi gì cả.
Thủ phạm thật sự là database đang bị hành hạ bởi những câu query JOIN, ORDER BY, SELECT không index, chạy đi chạy lại 10.000 lần.
Ví dụ thường thấy:
SQL
SELECT *
FROM users
JOIN posts ON posts.user_id = users.id
WHERE users.id = :id
ORDER BY posts.created_at DESC
LIMIT 10;
Không index → 3 giây. Có index → 50ms.
Hiểu lầm lớn nhất về Redis
Nghe tới Redis là người ta nghĩ ngay: “Cache — và rồi restart server là mất hết data?”
Đây là hiểu lầm phổ biến.
Redis đúng là in-memory, nhưng:
Nó có AOF/RDB persistence (ghi xuống đĩa định kỳ).
Nó không sinh ra để thay database.
Nó sinh ra để bảo vệ database khỏi tải nặng.
Cache giúp được gì? Và tại sao vẫn sai?
Bạn có query chạy 3 giây?
Bạn cache vào Redis với expire 5 phút?
→ Đúng, app nhanh ngay lập tức.
Nhưng dân chuyên vào gõ bạn là đúng.
Cache không chữa được query sida.
Nó chỉ che giấu vấn đề.
Giống như xe hư phanh mà bạn đi… bơm bánh cho đỡ lắc.
Chân lý: Database phải khỏe trước
Database là nơi duy nhất dữ liệu của bạn phải chính xác, ổn định và nhanh.
Một query 3 giây thường là do:
Thiếu index
Join không tối ưu
Scan table 20 triệu dòng
Dùng
ORDER BYtrên cột không indexSubquery lồng nhiều lớp
Kiến trúc bảng sai từ đầu
Không có cái nào trong mớ này là "có thể chữa bằng cache".
Ví dụ:
Bạn có bảng orders 5 triệu dòng.
SQL
SELECT * FROM orders ORDER BY created_at DESC LIMIT 20;
Không index → full table scan → 1.5–3 giây.
Thêm index: INDEX(created_at DESC) → 15–30ms.
DB đã khỏe rồi thì Redis còn làm gì?
Khi DB đã chạy 50ms/query rồi, vậy tại sao vẫn cần Redis?
Vì tốc độ không phải vấn đề — tải mới là vấn đề.
Nếu trang chủ có:
1.000 request/s
tất cả đều chạy cùng 1 query 50ms
→ DB của bạn vẫn bay màu.
Nhưng nếu cache kết quả trong 10 giây:
10.000 request vào
Chỉ có 1 request thật sự chạm DB
9.999 request còn lại lấy từ Redis trong 1–2ms
Những việc Redis làm xuất sắc hơn DB
1. Leaderboard / Bảng xếp hạng real-time
SQL ghét cay ghét đắng việc ORDER BY liên tục trên bảng 20 triệu dòng.
Redis Sorted Set xử lý O(log N):
REDIS
ZADD leaderboard 1500 "user:1"
ZRANGE leaderboard 0 9 WITHSCORES
Nhanh như chớp.
2. Queue gửi email / xử lý nền
Dùng bảng jobs trong DB → lock row, deadlock, chậm.
Redis List:
REDIS
LPUSH email_queue "{id:1, to:'[email protected]'}"
BRPOP email_queue 0
Đơn giản, nhẹ, nhanh.
3. Chat / Notification real-time
Đừng poll database 1000 lần/giây.
Redis Pub/Sub:
REDIS
PUBLISH notifications "New message"
SUBSCRIBE notifications
Gửi–nhận theo thời gian thực.
4. Rate limit / chống spam
SQL không sinh ra để đếm request.
Redis thì quá hợp.
REDIS
INCR user:123:request
EXPIRE user:123:request 60
5 dòng code → Rate-limit hoàn hảo.
Kết luận
Cache không chữa được query sida.
Luôn tối ưu DB trước: index, schema, query plan.
Khi DB khỏe rồi, Redis là lá chắn:
Chống tải nặng
Chạy real-time
Làm queue
Tạo leaderboard
Rate-limit
Redis không phải thuốc cấp cứu cho database sắp chết.
Redis là áo giáp cho database đang khỏe mạnh.