Nun, es hängt davon ab, wie Sie die Parallelität definieren.
In serverseitiger Software werden Parallelität und Parallelität häufig als unterschiedliche Konzepte betrachtet. In einem Server bedeutet die Unterstützung gleichzeitiger E / A, dass der Server mehrere Clients bedienen kann, indem er mehrere Flows ausführt, die diesen Clients mit nur einer Recheneinheit entsprechen. Parallelität würde in diesem Zusammenhang bedeuten, dass der Server mehrere Aufgaben gleichzeitig ausführen kann (mit mehreren Recheneinheiten), was unterschiedlich ist.
Zum Beispiel kann ein Barkeeper mehrere Kunden betreuen, während er jeweils nur ein Getränk zubereiten kann. So kann er Parallelität ohne Parallelität bereitstellen.
Diese Frage wurde hier diskutiert:
Was ist der Unterschied zwischen Parallelität und Parallelität?
Siehe auch diese Präsentation von Rob Pike.
Ein Single-Threaded-Programm kann definitiv Parallelität auf E / A-Ebene bereitstellen, indem ein E / A-Multiplexing-Mechanismus und eine Ereignisschleife verwendet werden (was Redis tut).
Parallelität hat Kosten: Mit den mehreren Sockeln / Kernen, die Sie auf moderner Hardware finden, ist die Synchronisation zwischen Threads extrem teuer. Andererseits ist der Engpass einer effizienten Speicher-Engine wie Redis sehr oft das Netzwerk, lange vor der CPU. Isolierte Ereignisschleifen (die keine Synchronisation erfordern) werden daher als gutes Design zum Aufbau effizienter, skalierbarer Server angesehen.
Die Tatsache, dass Redis-Operationen atomar sind, ist einfach eine Folge der Single-Threaded-Ereignisschleife. Der interessante Punkt ist, dass die Atomizität ohne zusätzliche Kosten bereitgestellt wird (es ist keine Synchronisation erforderlich). Es kann vom Benutzer genutzt werden, um optimistische Sperren und andere Muster zu implementieren, ohne den Synchronisationsaufwand zu bezahlen.