2012-05-07 5 views
106

Cố gắng nắm bắt một số khái niệm cơ bản về Redis Tôi đã xem một số thú vị blog post.Redis là đơn luồng, sau đó làm thế nào để nó đồng thời I/O?

Các trạng tác giả:

Redis là đơn luồng với epoll/kqueue và mở rộng vô hạn định về I/O đồng thời.

Tôi chắc chắn hiểu lầm toàn bộ vấn đề luồng, bởi vì tôi thấy phát biểu này khó hiểu. Nếu một chương trình là đơn luồng, làm thế nào nó làm bất cứ điều gì đồng thời? Tại sao nó là tuyệt vời như vậy mà Redis hoạt động là nguyên tử, nếu máy chủ là đơn luồng anyway?

Ai cũng có thể làm sáng tỏ vấn đề này?

Trả lời

206

Cũng tùy thuộc vào cách bạn xác định đồng thời.

Trong phần mềm phía máy chủ, đồng thời và song song thường được coi là các khái niệm khác nhau. Trong một máy chủ, hỗ trợ I/O đồng thời có nghĩa là máy chủ có thể phục vụ một số máy khách bằng cách thực hiện một số luồng tương ứng với các máy khách đó chỉ với một đơn vị tính toán. Trong bối cảnh này, song song sẽ có nghĩa là máy chủ có thể thực hiện một số điều cùng một lúc (với nhiều đơn vị tính toán), khác nhau.

Ví dụ: một bartender có thể chăm sóc một số khách hàng trong khi ông chỉ có thể chuẩn bị một loại đồ uống tại một thời điểm. Vì vậy, ông có thể cung cấp đồng thời mà không có song song.

Câu hỏi này đã được tranh luận ở đây: Concurrency vs Parallelism - What is the difference?

Xem thêm this presentation từ Rob Pike.

Một chương trình đơn luồng chắc chắn có thể cung cấp đồng thời ở cấp I/O bằng cách sử dụng cơ chế ghép kênh I/O (de) và vòng lặp sự kiện (đó là những gì Redis thực hiện).

Tính song song có chi phí: với nhiều ổ cắm/nhiều lõi bạn có thể tìm thấy trên phần cứng hiện đại, đồng bộ hóa giữa các chuỗi cực kỳ tốn kém. Mặt khác, các nút cổ chai của một công cụ lưu trữ hiệu quả như Redis là rất thường xuyên mạng, cũng trước khi CPU. Các vòng lặp sự kiện bị cô lập (không yêu cầu đồng bộ hóa) do đó được xem là một thiết kế tốt để xây dựng các máy chủ hiệu quả, có khả năng mở rộng.

Thực tế là các phép toán Redis là nguyên tử đơn giản là kết quả của vòng lặp sự kiện đơn luồng.Điểm thú vị là nguyên tử được cung cấp mà không mất thêm chi phí (nó không yêu cầu đồng bộ hóa). Nó có thể được khai thác bởi người dùng để thực hiện khóa lạc quan và các mẫu khác mà không phải trả tiền cho chi phí đồng bộ hóa.

+72

Tương tự bartender đẹp :) –

+0

Điều đó đã giúp ích rất nhiều, cảm ơn rất nhiều! –

+0

Đơn giản và rõ ràng, cảm ơn. – harsha

11

OK, Redis là đơn luồng ở cấp người dùng, OTOH, tất cả I/O không đồng bộ được hỗ trợ bởi các nhóm luồng hạt nhân và/hoặc trình điều khiển cấp phân tách.

'Đồng thời', với một số, bao gồm phân phối sự kiện mạng cho các máy trạng thái ổ cắm. Đó là đơn luồng, chạy trên một lõi, (ở cấp độ người dùng), vì vậy tôi sẽ không đề cập đến điều này như đồng thời. Những người khác khác ..

'quy mô vô thời hạn về I/O đồng thời' chỉ là kinh tế với sự thật. Họ có thể nhận được nhiều niềm tin hơn nếu họ nói 'có thể mở rộng hơn một luồng cho mỗi khách hàng, cung cấp cho khách hàng không yêu cầu nhiều', mặc dù sau đó họ có thể cảm thấy bắt buộc phải thêm 'bị thổi bay nặng bởi các giải pháp không đồng bộ khác sử dụng tất cả các lõi ở cấp người dùng '.