Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis ist Single-Threaded, wie macht es dann gleichzeitige I/O?

Nun, es hängt davon ab, wie Sie Nebenläufigkeit definieren.

In serverseitiger Software werden Nebenläufigkeit und Parallelität oft als unterschiedliche Konzepte betrachtet. Bei einem Server bedeutet die Unterstützung gleichzeitiger I/Os, dass der Server mehrere Clients bedienen kann, indem er mehrere Flüsse entsprechend diesen Clients mit nur einer Recheneinheit ausführt. Parallelität würde in diesem Zusammenhang bedeuten, dass der Server mehrere Dinge gleichzeitig ausführen kann (mit mehreren Recheneinheiten), was anders ist.

Beispielsweise kann ein Barkeeper mehrere Kunden betreuen, während er immer nur ein Getränk auf einmal zubereiten kann. So kann er Nebenläufigkeit ohne Parallelität bereitstellen.

Diese Frage wurde hier diskutiert:Was ist der Unterschied zwischen Nebenläufigkeit und Parallelität?

Siehe auch diese Präsentation von Rob Pike.

Ein Singlethread-Programm kann auf jeden Fall Parallelität auf E/A-Ebene bereitstellen, indem es einen E/A- (De-)Multiplexing-Mechanismus und eine Ereignisschleife verwendet (was Redis tut).

Parallelität hat ihren Preis:Mit den Mehrfachsteckdosen/Mehrfachkernen, die Sie auf moderner Hardware finden können, ist die Synchronisierung zwischen Threads extrem teuer. Auf der anderen Seite ist der Flaschenhals einer effizienten Speicher-Engine wie Redis sehr oft das Netzwerk, lange vor der CPU. Isolierte Ereignisschleifen (die keine Synchronisierung erfordern) werden daher als gutes Design zum Aufbau effizienter, skalierbarer Server angesehen.

Die Tatsache, dass Redis-Operationen atomar sind, ist einfach eine Folge der Singlethread-Ereignisschleife. Der interessante Punkt ist, dass die Atomarität ohne zusätzliche Kosten bereitgestellt wird (es erfordert keine Synchronisation). Es kann vom Benutzer ausgenutzt werden, um optimistisches Sperren und andere Muster zu implementieren, ohne für den Synchronisierungsaufwand zu zahlen.