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

Redis er single-threaded, hvordan gør det så samtidig I/O?

Det afhænger af, hvordan du definerer samtidighed.

I server-side software betragtes samtidighed og parallelitet ofte som forskellige begreber. I en server betyder understøttelse af samtidige I/O'er, at serveren er i stand til at betjene flere klienter ved at udføre flere flows svarende til de klienter med kun én beregningsenhed. I denne sammenhæng ville parallelitet betyde, at serveren er i stand til at udføre flere ting på samme tid (med flere beregningsenheder), hvilket er forskelligt.

For eksempel er en bartender i stand til at passe flere kunder, mens han kun kan tilberede én drik ad gangen. Så han kan give samtidighed uden parallelitet.

Dette spørgsmål er blevet diskuteret her:Hvad er forskellen mellem samtidighed og parallelisme?

Se også denne præsentation fra Rob Pike.

Et enkelt-trådet program kan helt sikkert give samtidighed på I/O-niveau ved at bruge en I/O (de)multipleksmekanisme og en hændelsesløkke (hvilket er hvad Redis gør).

Parallelisme har en omkostning:med de mange stikkontakter/flere kerner, du kan finde på moderne hardware, er synkronisering mellem tråde ekstremt dyrt. På den anden side er flaskehalsen ved en effektiv lagermotor som Redis meget ofte netværket, et godt stykke tid før CPU'en. Isolerede hændelsesløkker (som ikke kræver nogen synkronisering) ses derfor som et godt design til at bygge effektive, skalerbare servere.

Det faktum, at Redis-operationer er atomare, er simpelthen en konsekvens af den enkelt-trådede begivenhedsløkke. Det interessante punkt er, at atomicitet leveres uden ekstra omkostninger (det kræver ikke synkronisering). Det kan udnyttes af brugeren til at implementere optimistisk låsning og andre mønstre uden at betale for synkroniseringsomkostningerne.



  1. Mongodb:flere samlinger eller en stor samling med indeks

  2. MongoDB på Azure:Hvordan vælger man den rigtige instanstype?

  3. Vælg poster, der matcher den sammensatte værdi af to felter i mongodb

  4. MongoDB $ne Aggregation Pipeline Operator