Redis xử lý phần lớn command bằng một thread duy nhất theo mô hình event loop (giống NodeJS).
👉 Không có context switching giữa nhiều thread xử lý command
👉 Không cần lock data structure
👉 Giảm race condition ở level command
Redis dùng I/O multiplexing (epoll trên Linux).
Luồng xử lý:
Tức là:
while (true) {
wait_for_event();
process_command();
}
Redis không tạo thread cho mỗi request.
Nó xử lý tuần tự nhưng rất nhanh vì mọi thứ ở RAM.
Vì:
Ví dụ:
GET key
→ chỉ tra hash table trong RAM → microsecond
Câu hỏi phỏng vấn rất hay.
Từ phiên bản 6 trở đi:
Tức là:
| Thành phần | Thread |
|---|---|
| Execute command | 1 |
| Network I/O | nhiều |
✅ Không cần lock
✅ Không deadlock
✅ Độ trễ thấp
✅ Code đơn giản
❌ Nếu 1 command chạy lâu → block toàn bộ server
Ví dụ:
→ Redis sẽ đứng cho tới khi xong.
Ở mức command → không
Ví dụ:
INCR key
là atomic.
Nhưng ở business logic thì có:
GET key
if null
SET key
→ có thể bị race
Giải pháp:
Nếu họ hỏi:
Redis là single-thread, vậy sao chịu được 50k QPS?
Bạn trả lời:
Redis sử dụng event loop và I/O multiplexing.
Nó tránh context switching và lock, nên dù xử lý tuần tự nhưng cực nhanh vì mọi dữ liệu nằm trong RAM.
Từ Redis 6 có multi-thread cho network I/O nhưng execution vẫn single-thread để đảm bảo tính atomic.