sql >> Database >  >> NoSQL >> Redis

waarom Redis single-threaded is (gebeurtenisgestuurd)

TL;DR :Enkele thread maakt redis eenvoudiger en redis is nog steeds IO-gebonden.

Geheugen is I/O. Redis is nog steeds I/O-gebonden. Wanneer redis zwaar wordt belast en het maximale aantal verzoeken per seconde bereikt, is het meestal uitgehongerd voor netwerkbandbreedte of geheugenbandbreedte en gebruikt het meestal niet veel van de CPU. Er zijn bepaalde opdrachten waarvoor dit niet waar is, maar in de meeste gevallen zal redis ernstig I/O-gebonden zijn door netwerk of geheugen.

Tenzij geheugen- en netwerksnelheden plotseling orden van grootte sneller worden, is single-threaded meestal geen probleem. Als u verder dan een of enkele threads moet schalen (dwz:master<->slave<->slave setup), kijkt u al naar Redis Cluster. In dat geval kun je een clusterinstantie per CPU-kern instellen als je op de een of andere manier CPU-uitgehongerd bent en het aantal threads wilt maximaliseren.

Ik ben niet erg bekend met redis source of internals, maar ik kan zien hoe het gebruik van een enkele thread het gemakkelijk maakt om lockless atomaire acties te implementeren. Threads zouden dit complexer maken en lijken geen grote voordelen te bieden aangezien redis niet CPU-gebonden is. Het implementeren van gelijktijdigheid op een niveau boven een redis-instantie lijkt een goede oplossing, en dat is waar Redis Sentinel en Redis Cluster bij helpen.

Wat gebeurt er met andere verzoeken als het opnieuw verzenden lang duurt?

Die andere verzoeken worden geblokkeerd terwijl redis het lange verzoek voltooit. Indien nodig kunt u dit testen met behulp van de client-pause commando.



  1. Hoe de $set Update Operator werkt in MongoDB

  2. Microsoft.Extensions.Caching.Redis selecteer een andere database dan db0

  3. Verschil tussen Find en FindAsync

  4. mongodb-query zonder veldnaam