Er is een schat aan informatie in de Redis-documentatie om te begrijpen hoe het werkt. Om nu specifiek uw vragen te beantwoorden:
1) Hoe worden verbindingen onderhouden?
Verbindingen worden onderhouden en beheerd met behulp van de ae event loop (ontworpen door de auteur van Redis). Alle netwerk-I/O-bewerkingen zijn niet-blokkerend. Je kunt ae zien als een minimalistische implementatie met behulp van het beste netwerk I/O-demultiplexingmechanisme van het platform (epoll voor Linux, kqueue voor BSD, enz ...) net als libevent, libev, libuv, enz ...
2) Zijn verbindingen TCP of HTTP?
Verbindingen zijn TCP met behulp van het Redis-protocol, een eenvoudig telnet-compatibel, tekstgeoriënteerd protocol dat binaire gegevens ondersteunt. Dit protocol is doorgaans efficiënter dan HTTP.
3) Hoe wordt het geheugen beheerd?
Het geheugen wordt beheerd door te vertrouwen op een algemene geheugentoewijzer. Op sommige platforms is dit eigenlijk de systeemgeheugentoewijzer. Op sommige andere platforms (waaronder Linux) is voor jemalloc gekozen omdat het een goede balans biedt tussen CPU-verbruik, gelijktijdigheidsondersteuning, fragmentatie en geheugenvoetafdruk. de broncode van jemalloc maakt deel uit van de Redis-distributie.
In tegenstelling tot andere producten (zoals memcached), is er in Redis geen implementatie van een slab-allocator.
Een aantal geoptimaliseerde datastructuren zijn geïmplementeerd bovenop de allocator voor algemene doeleinden om de geheugenvoetafdruk te verkleinen.
4) Wat zijn de synchronisatietechnieken die worden gebruikt om een hoge doorvoer te bereiken ondanks concurrerende lees-/schrijfbewerkingen?
Redis is een gebeurtenislus met één thread, dus er is geen synchronisatie nodig omdat alle opdrachten geserialiseerd zijn. Nu draaien sommige threads ook op de achtergrond voor interne doeleinden. In de zeldzame gevallen dat ze toegang hebben tot de gegevens die worden beheerd door de hoofdthread, worden klassieke pthread-synchronisatieprimitieven gebruikt (mutexen bijvoorbeeld). Maar 100% van de gegevenstoegangen namens meerdere clientverbindingen vereisen geen synchronisatie.
U kunt daar meer informatie vinden:Redis is single-threaded, hoe doet het dan gelijktijdige I/O?
Wat is het verschil tussen een gewone vanille-implementatie van een machine met een geheugencache en een server die kan reageren op opdrachten en een Redis-box?
Er is geen verschil. Redis is een eenvoudige vanille-implementatie van een machine met een geheugencache en een server die op opdrachten kan reageren. Maar het is een implementatie die goed is gedaan:
- gebruik makend van het enkelvoudige threaded event loop-model
- met behulp van eenvoudige en minimalistische gegevensstructuren die zijn geoptimaliseerd voor hun overeenkomstige gebruiksscenario's
- een reeks zorgvuldig gekozen commando's aanbieden om minimalisme en bruikbaarheid in evenwicht te brengen
- voortdurend de beste onbewerkte prestaties targeten
- goed aangepast aan moderne OS-mechanismen
- het bieden van meerdere volhardingsmechanismen omdat de "one size does fit all"-benadering slechts een droom is.
- het leveren van de bouwstenen voor HA-mechanismen (bijvoorbeeld replicatiesysteem)
- het vermijden van het opstapelen van nutteloze abstractielagen zoals pannenkoeken
- resulterend in een schone en begrijpelijke codebasis waar elke goede C-ontwikkelaar zich prettig bij kan voelen