Der er et væld af oplysninger i Redis-dokumentationen for at forstå, hvordan det fungerer. For at besvare specifikt dine spørgsmål:
1) Hvordan vedligeholdes forbindelser?
Forbindelser vedligeholdes og administreres ved hjælp af ae-hændelsesløkken (designet af Redis-forfatteren). Alle netværks I/O-operationer er ikke-blokerende. Du kan se ae som en minimalistisk implementering, der bruger platformens bedste netværks-I/O-demultipleksmekanisme (epoll for Linux, kqueue for BSD, osv. ...) ligesom libevent, libev, libuv, osv. ...
2) Er forbindelser TCP eller HTTP?
Forbindelser er TCP ved hjælp af Redis-protokollen, som er en simpel telnet-kompatibel, tekstorienteret protokol, der understøtter binære data. Denne protokol er typisk mere effektiv end HTTP.
3) Hvordan administreres hukommelsen?
Hukommelse styres ved at stole på en generel hukommelsesallokator. På nogle platforme er dette faktisk systemhukommelsesallokatoren. På nogle andre platforme (inklusive Linux) er jemalloc blevet valgt, da det giver en god balance mellem CPU-forbrug, samtidighedsunderstøttelse, fragmentering og hukommelsesfodaftryk. jemalloc-kildekoden er en del af Redis-distributionen.
I modsætning til andre produkter (såsom memcached) er der ingen implementering af en pladeallokator i Redis.
En række optimerede datastrukturer er blevet implementeret oven på den generelle formålsallokator for at reducere hukommelsesfodaftrykket.
4) Hvilke synkroniseringsteknikker bruges til at opnå høj gennemstrømning på trods af konkurrerende læsning/skrivning?
Redis er en enkelt-trådet hændelsesløkke, så der er ingen synkronisering, der skal udføres, da alle kommandoer er serialiseret. Nu kører nogle tråde også i baggrunden til interne formål. I de sjældne tilfælde får de adgang til de data, der administreres af hovedtråden, der bruges klassiske pthread-synkroniseringsprimitiver (f.eks. mutexes). Men 100 % af de dataadgange, der foretages på vegne af flere klientforbindelser, kræver ingen synkronisering.
Du kan finde mere information der:Redis er enkelttrådet, hvordan udfører den så samtidig I/O?
Hvad er forskellen mellem en almindelig vanilla-implementering af en maskine med hukommelsescache og server, der kan reagere på kommandoer, og en Redis-boks?
Der er ingen forskel. Redis er en almindelig vaniljeimplementering af en maskine med hukommelsescache og server, der kan reagere på kommandoer. Men det er en implementering, der gøres rigtigt:
- ved at bruge den enkelttrådede hændelsesløkkemodel
- ved at bruge enkle og minimalistiske datastrukturer, der er optimeret til deres tilsvarende brugssituationer
- tilbyder et sæt kommandoer nøje udvalgt for at balancere minimalisme og anvendelighed
- konstant målrettet mod den bedste rå ydeevne
- godt tilpasset moderne OS-mekanismer
- at give flere persistensmekanismer, fordi "one size does fit all"-tilgangen kun er en drøm.
- leverer byggestenene til HA-mekanismer (f.eks. replikeringssystem)
- undgå at stable ubrugelige abstraktionslag som pandekager
- hvilket resulterer i en ren og forståelig kodebase, som enhver god C-udvikler kan være fortrolig med