Redis є однопоточним, то як це робити одночасно вводу / виводу?


169

Намагаючись зрозуміти деякі основи Redis, я натрапив на цікавий пост у блозі .

Автор констатує:

Redis є однопоточним з epoll / kqueue та масштабом необмежено з точки зору одночасності вводу-виводу.

Я, безумовно, неправильно розумію всю різьбову річ, тому що вважаю це твердження дивним. Якщо програма є однопотоковою, як вона робить щось одночасно? Чому це так чудово, що операції Redis є атомними, якщо сервер все одно є однопоточним?

Чи може хтось, будь ласка, пролити трохи світла на це питання?

Відповіді:


359

Ну, це залежить від того, як ви визначаєте одночасність.

У серверному програмному забезпеченні паралельність і паралелізм часто розглядаються як різні поняття. На сервері, що підтримує паралельні введення / виведення, означає, що сервер здатний обслуговувати декілька клієнтів, виконуючи кілька потоків, відповідних цим клієнтам, лише з однією обчислювальною одиницею. У цьому контексті паралелізм означав би, що сервер здатний виконувати кілька речей одночасно (з декількома одиницями обчислень), що відрізняється.

Наприклад, бармен здатний доглядати за кількома клієнтами, в той час як він може готувати лише один напій за один раз. Тож він може забезпечити паралельність без паралелізму.

Це питання було обговорено тут: Чим відрізняється паралельність і паралелізм?

Дивіться також цю презентацію від Rob Pike.

Однопотокова програма напевно може забезпечити паралельність на рівні вводу / виводу за допомогою механізму мультиплексування вводу / виводу (de) та циклу подій (що робить Redis).

Паралелізм коштує: за допомогою декількох розеток / декількох ядер, які можна знайти на сучасному обладнанні, синхронізація між потоками надзвичайно дорога. З іншого боку, вузьке місце такого ефективного накопичувача, як Redis, дуже часто є мережею, задовго до процесора. Тому окремі цикли подій (які не потребують синхронізації) розглядаються як хороша конструкція для створення ефективних, масштабованих серверів.

Те, що операції Redis є атомними, є просто наслідком однопотокового циклу подій. Цікавий момент - атомність надається без додаткових витрат (вона не потребує синхронізації). Користувач може використовувати його для реалізації оптимістичних блокувань та інших шаблонів, не платячи за синхронізацію.


135
Приємна аналогія бармена :)
Серхіо Туленцев

3
v4 - зміна ігор у цьому відношенні - дивіться мою відповідь на stackoverflow.com/a/45374864/3160475 :)
Ітамар Хабер

1
Єдине, що мені не дуже подобається у відповіді та порівнянні, це те, що це здається, що паралельність не працює паралельно, і це, безумовно, так, як я можу перевірити це за допомогою запущеної задачі асинхронізації та початку роботи, що в кінцевому рахунку вважаються паралельними. паралелізм у контексті цієї статті має на увазі багатоядерність того, що можна працювати на змішаних нитках. Тобто, посилання на це є безпечним для потоків.
Крістіан Матвій

Все ще діє в 2020 році?
Роберто Манфреда

21

Гаразд, Redis є однопоточним на рівні користувача, OTOH, всі асинхронні введення / виведення підтримуються пулами ниток ядра та / або драйверами роздільного рівня.

" Одночасно ", для деяких, включає розповсюдження мережевих подій на державних сокетах. Він однопоточний, працює на одному ядрі (на рівні користувача), тому я б не посилався на це як на одночасне. Інші відрізняються ..

" масштаб безстроково з точки зору одночасності введення-виводу " є просто економічним з правдою. Вони можуть отримати більше віри, якщо вони сказали, що "можуть масштабуватись краще, ніж один потік на клієнта, за умови, що клієнти не просять багато", хоча вони можуть потім відчувати себе зобов'язаними додавати "здутих під час великого завантаження іншими рішеннями асинхронізації які використовують усі ядра на рівні користувача '.


Може бути поза контекстом, але чи кожна операція оновлення (як за командою INCR) не має блокування? Якщо на ключі (на запит) є 1000 одночасних запитів і одна операція збільшення, чи гарантує це, що змінна збільшується лише в 1000 разів?
Аманда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.