C'è una grande quantità di informazioni nella documentazione Redis per capire come funziona. Ora, per rispondere in modo specifico alle tue domande:
1) Come vengono mantenute le connessioni?
Le connessioni vengono mantenute e gestite utilizzando il ciclo di eventi ae (progettato dall'autore Redis). Tutte le operazioni di I/O di rete non sono bloccanti. Puoi vedere ae come un'implementazione minimalista che utilizza il miglior meccanismo di demultiplexing di I/O di rete della piattaforma (epoll per Linux, kqueue per BSD, ecc ...) proprio come libevent, libev, libuv, ecc ...
2) Le connessioni sono TCP o HTTP?
Le connessioni sono TCP utilizzando il protocollo Redis, che è un semplice protocollo orientato al testo compatibile con telnet che supporta dati binari. Questo protocollo è in genere più efficiente di HTTP.
3) Come viene gestita la memoria?
La memoria viene gestita facendo affidamento su un allocatore di memoria generico. Su alcune piattaforme, questo è in realtà l'allocatore di memoria di sistema. Su alcune altre piattaforme (incluso Linux), jemalloc è stato selezionato poiché offre un buon equilibrio tra consumo di CPU, supporto per la concorrenza, frammentazione e footprint di memoria. il codice sorgente jemalloc fa parte della distribuzione Redis.
Contrariamente ad altri prodotti (come memcached), in Redis non è prevista l'implementazione di un allocatore di lastre.
Una serie di strutture di dati ottimizzate sono state implementate in aggiunta all'allocatore per scopi generici per ridurre l'ingombro di memoria.
4) Quali sono le tecniche di sincronizzazione utilizzate per ottenere un throughput elevato nonostante le operazioni di lettura/scrittura concorrenti?
Redis è un ciclo di eventi a thread singolo, quindi non è necessario eseguire la sincronizzazione poiché tutti i comandi sono serializzati. Ora, alcuni thread vengono eseguiti anche in background per scopi interni. Nei rari casi in cui accedono ai dati gestiti dal thread principale, vengono utilizzate le classiche primitive di sincronizzazione dei pthread (ad esempio i mutex). Ma il 100% degli accessi ai dati effettuati per conto di più connessioni client non richiede alcuna sincronizzazione.
Puoi trovare maggiori informazioni qui:Redis è a thread singolo, quindi come fa I/O simultanei?
Qual è la differenza tra una semplice implementazione vanilla di una macchina con cache in memoria e server in grado di rispondere ai comandi e una casella Redis?
Non c'è differenza. Redis è una semplice implementazione vanilla di una macchina con cache in memoria e server in grado di rispondere ai comandi. Ma è un'implementazione fatta bene:
- utilizzando il modello di loop di eventi a thread singolo
- utilizzando strutture di dati semplici e minimaliste ottimizzate per i casi d'uso corrispondenti
- offrendo una serie di comandi scelti con cura per bilanciare minimalismo e utilità
- mirare costantemente al miglior rendimento grezzo
- ben adattato ai moderni meccanismi del sistema operativo
- fornire più meccanismi di persistenza perché l'approccio "taglia unica" è solo un sogno.
- fornire i mattoni per i meccanismi HA (sistema di replica per esempio)
- evitando di accumulare inutili strati di astrazione come i pancake
- risultando in una base di codice chiara e comprensibile con cui qualsiasi buon sviluppatore C può sentirsi a proprio agio