sql >> Databasteknik >  >> NoSQL >> Redis

Redis är entrådig, hur gör den då samtidig I/O?

Det beror på hur du definierar samtidighet.

I mjukvara på serversidan betraktas ofta samtidighet och parallellism som olika begrepp. I en server innebär stöd för samtidiga I/O att servern kan betjäna flera klienter genom att exekvera flera flöden som motsvarar de klienter med endast en beräkningsenhet. I detta sammanhang skulle parallellitet innebära att servern kan utföra flera saker samtidigt (med flera beräkningsenheter), vilket är annorlunda.

Till exempel kan en bartender ta hand om flera kunder medan han bara kan laga en dryck åt gången. Så han kan ge samtidighet utan parallellitet.

Denna fråga har diskuterats här:Vad är skillnaden mellan samtidighet och parallellism?

Se även denna presentation från Rob Pike.

Ett entrådigt program kan definitivt ge samtidighet på I/O-nivå genom att använda en I/O (de)multiplexeringsmekanism och en händelseloop (vilket är vad Redis gör).

Parallellism har en kostnad:med de flera socklar/flera kärnor du kan hitta på modern hårdvara, är synkronisering mellan trådar extremt dyr. Å andra sidan är flaskhalsen för en effektiv lagringsmotor som Redis väldigt ofta nätverket, långt före CPU:n. Isolerade händelseslingor (som inte kräver någon synkronisering) ses därför som en bra design för att bygga effektiva, skalbara servrar.

Det faktum att Redis verksamhet är atomär är helt enkelt en konsekvens av den entrådade händelseslingan. Det intressanta är att atomiciteten tillhandahålls utan extra kostnad (det kräver inte synkronisering). Det kan utnyttjas av användaren för att implementera optimistisk låsning och andra mönster utan att betala för synkroniseringskostnader.



  1. Hur utesluter man dokument från sökresultat med fält som inte finns i frågan?

  2. Lagra och hämta JavaScript-objekt i/från MongoDB

  3. $unset är tom. Du måste ange ett fält så här:{$unset:{<field>:...}}

  4. Docker [Errnr 111] Anslut samtal misslyckades ('127.0.0.1', 6379)