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).


1️⃣ Single-threaded nghĩa là gì?

  • Chỉ 1 thread chính xử lý:
    • Nhận request
    • Thực thi command
    • Trả response

👉 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


2️⃣ Event Loop hoạt động thế nào?

Redis dùng I/O multiplexing (epoll trên Linux).

Luồng xử lý:

  1. Client gửi request
  2. OS notify Redis có socket ready
  3. Redis đưa request vào queue
  4. Event loop xử lý lần lượt từng command
  5. Trả kết quả

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.


3️⃣ Vì sao vẫn xử lý được hàng chục nghìn request/giây?

Vì:

  • RAM cực nhanh
  • Command thường O(1)
  • Không lock
  • Không context switch
  • Không blocking I/O

Ví dụ:

GET key

→ chỉ tra hash table trong RAM → microsecond


4️⃣ Redis có thực sự single-thread hoàn toàn không?

Câu hỏi phỏng vấn rất hay.

Từ phiên bản 6 trở đi:

  • Redis vẫn single-thread cho command execution
  • Nhưng có multi-thread cho:
    • I/O read
    • I/O write

Tức là:

Thành phầnThread
Execute command1
Network I/Onhiều

5️⃣ Ưu điểm của mô hình này

✅ Không cần lock
✅ Không deadlock
✅ Độ trễ thấp
✅ Code đơn giản


6️⃣ Nhược điểm

❌ Nếu 1 command chạy lâu → block toàn bộ server

Ví dụ:

  • KEYS *
  • SMEMBERS set lớn
  • Lua script nặng

→ Redis sẽ đứng cho tới khi xong.


7️⃣ Race condition có tồn tại không?

Ở 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:

  • SETNX
  • Lua script
  • Redlock

8️⃣ Khi nào Redis chậm?

  • Big O(N) command
  • Memory swap
  • AOF rewrite
  • CPU 100%
  • Network bottleneck

9️⃣ Câu trả lời mẫu khi đi phỏng vấn

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.