Redis
 sql >> Database >  >> NoSQL >> Redis

Redis è a thread singolo, quindi come fa l'I/O simultaneo?

Beh, dipende da come definisci la concorrenza.

Nel software lato server, concorrenza e parallelismo sono spesso considerati concetti diversi. In un server, il supporto di I/O simultanei significa che il server è in grado di servire diversi client eseguendo diversi flussi corrispondenti a quei client con una sola unità di calcolo. In questo contesto, il parallelismo significherebbe che il server è in grado di eseguire più cose contemporaneamente (con più unità di calcolo), il che è diverso.

Ad esempio un barista è in grado di prendersi cura di più clienti mentre può preparare solo una bevanda alla volta. Quindi può fornire concorrenza senza parallelismo.

Questa domanda è stata discussa qui:qual è la differenza tra concorrenza e parallelismo?

Vedi anche questa presentazione di Rob Pike.

Un programma a thread singolo può sicuramente fornire concorrenza a livello di I/O utilizzando un meccanismo di (de)multiplexing I/O e un ciclo di eventi (che è ciò che fa Redis).

Il parallelismo ha un costo:con i socket multipli/core multipli che puoi trovare sull'hardware moderno, la sincronizzazione tra i thread è estremamente costosa. D'altra parte, il collo di bottiglia di uno storage engine efficiente come Redis è molto spesso la rete, ben prima della CPU. I loop di eventi isolati (che non richiedono sincronizzazione) sono quindi visti come un buon progetto per costruire server efficienti e scalabili.

Il fatto che le operazioni Redis siano atomiche è semplicemente una conseguenza del ciclo di eventi a thread singolo. Il punto interessante è che l'atomicità è fornita senza costi aggiuntivi (non richiede sincronizzazione). Può essere sfruttato dall'utente per implementare il blocco ottimistico e altri modelli senza pagare il sovraccarico di sincronizzazione.