Redis là một luồng đơn, vậy làm thế nào để nó thực hiện I / O đồng thời?


169

Cố gắng nắm bắt một số điều cơ bản của Redis, tôi đã xem qua một bài đăng blog thú vị .

Tác giả nêu:

Redis là một luồng đơn với epoll / kqueue và quy mô vô thời hạn về mặt đồng thời I / O.

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

Bất cứ ai có thể xin làm sáng tỏ vấn đề?

Câu trả lời:


359

Vâng, nó phụ 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ố khách hàng 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ố việc cùng một lúc (với nhiều đơn vị tính toán), điều này là khác nhau.

Chẳng hạn, một nhân viên pha chế có thể chăm sóc một số khách hàng trong khi anh ta chỉ có thể chuẩn bị một đồ uống mỗi lần. Vì vậy, anh ta có thể cung cấp đồng thời mà không cần song song.

Câu hỏi này đã được tranh luận ở đây: sự khác biệt giữa đồng thời và song song là gì?

Xem thêm phần trình bày này 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 làm).

Parallelism có một 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 luồng là cực kỳ tốn kém. Mặt khác, nút cổ chai của một công cụ lưu trữ hiệu quả như Redis rất thường là mạng, trước cả CPU. Do đó, các vòng lặp sự kiện riêng biệt (không yêu cầu đồng bộ hóa) được xem là một thiết kế tốt để xây dựng các máy chủ hiệu quả, có thể mở rộng.

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


135
Tương tự bartender đẹp :)
Sergio Tulentsev

3
v4 là một người thay đổi trò chơi về mặt này - xem câu trả lời của tôi tại stackoverflow.com/a/45374864/3160475 :)
Itamar Haber

1
điều duy nhất tôi không thực sự thích về câu trả lời và so sánh là nó làm cho nó có vẻ như đồng thời không hoạt động song song và chắc chắn là tôi có thể kiểm tra điều này với việc chạy async và hoàn thành công việc cuối cùng được coi là song song. song song trong bối cảnh của bài viết đó là đề cập đến bản chất đa lõi của việc có thể chạy trên các luồng đa dạng. Tức là tại sao đề cập đến nó là chủ đề an toàn.
Christian Matthew

Vẫn còn hiệu lực vào năm 2020?
Roberto Manfreda

21

OK, Redis là một luồng đơn ở 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 nhân và / hoặc trình điều khiển mức chia.

' Đồng thời ', đối với một số người, bao gồm phân phối các sự kiện mạng cho các máy trạng thái ổ cắm. Nó đơ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 coi đây là đồng thời. Những người khác thì khác ..

' quy mô vô thời hạn về mặt đồng thời I / O ' chỉ là kinh tế với sự thật. Họ có thể có thêm niềm tin nếu họ nói 'có thể mở rộng quy mô tốt hơn một luồng trên 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 vào 'tải nặng bằng 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 '.


Có thể nằm ngoài ngữ cảnh nhưng mỗi thao tác cập nhật (theo lệnh INCR) có mang theo khóa không? Nếu có 1000 yêu cầu đồng thời và một thao tác gia tăng trên một khóa (mỗi yêu cầu), điều đó có đảm bảo rằng biến đó chỉ được tăng 1000 lần không?
Amanda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.