Nou, het hangt ervan af hoe je gelijktijdigheid definieert.
In server-side software worden gelijktijdigheid en parallellisme vaak als verschillende concepten beschouwd. In een server betekent het ondersteunen van gelijktijdige I/O's dat de server meerdere clients kan bedienen door verschillende stromen uit te voeren die overeenkomen met die clients met slechts één rekeneenheid. In deze context zou parallellisme betekenen dat de server verschillende dingen tegelijkertijd kan uitvoeren (met meerdere rekeneenheden), wat anders is.
Een barman kan bijvoorbeeld meerdere klanten bedienen, terwijl hij slechts één drankje tegelijk kan bereiden. Zodat hij gelijktijdigheid kan bieden zonder parallellisme.
Deze vraag is hier besproken:wat is het verschil tussen gelijktijdigheid en parallellisme?
Zie ook deze presentatie van Rob Pike.
Een programma met één thread kan zeker gelijktijdigheid bieden op I/O-niveau door gebruik te maken van een I/O-(de)multiplexmechanisme en een event-loop (wat Redis doet).
Parallellisme heeft een prijs:met de meerdere sockets/meerdere cores die je op moderne hardware kunt vinden, is synchronisatie tussen threads extreem duur. Aan de andere kant is de bottleneck van een efficiënte opslagengine als Redis vaak het netwerk, ruim voor de CPU. Geïsoleerde event loops (die geen synchronisatie vereisen) worden daarom gezien als een goed ontwerp om efficiënte, schaalbare servers te bouwen.
Het feit dat Redis-bewerkingen atomair zijn, is gewoon een gevolg van de gebeurtenislus met één thread. Het interessante punt is dat atomiciteit wordt geleverd zonder extra kosten (het vereist geen synchronisatie). Het kan door de gebruiker worden misbruikt om optimistische vergrendelings- en andere patronen te implementeren zonder te betalen voor de synchronisatie-overhead.