In der Redis-Dokumentation finden Sie eine Fülle von Informationen, um zu verstehen, wie es funktioniert. Um nun speziell Ihre Fragen zu beantworten:
1) Wie werden Verbindungen aufrechterhalten?
Verbindungen werden mithilfe der ae-Ereignisschleife (entworfen vom Redis-Autor) aufrechterhalten und verwaltet. Alle Netzwerk-E/A-Operationen sind nicht blockierend. Sie können ae als eine minimalistische Implementierung ansehen, die den besten Netzwerk-I/O-Demultiplexing-Mechanismus der Plattform verwendet (epoll für Linux, kqueue für BSD usw.), genau wie libevent, libev, libuv usw. ...
2) Sind Verbindungen TCP oder HTTP?
Verbindungen sind TCP unter Verwendung des Redis-Protokolls, das ein einfaches Telnet-kompatibles, textorientiertes Protokoll ist, das binäre Daten unterstützt. Dieses Protokoll ist normalerweise effizienter als HTTP.
3) Wie wird der Speicher verwaltet?
Der Speicher wird verwaltet, indem man sich auf einen Allzweck-Speicherzuordner stützt. Auf einigen Plattformen ist dies tatsächlich der Systemspeicherzuordner. Auf einigen anderen Plattformen (einschließlich Linux) wurde jemalloc ausgewählt, da es ein gutes Gleichgewicht zwischen CPU-Verbrauch, Parallelitätsunterstützung, Fragmentierung und Speicherbedarf bietet. Der Quellcode von jemalloc ist Teil der Redis-Distribution.
Im Gegensatz zu anderen Produkten (z. B. Memcached) gibt es in Redis keine Implementierung eines Slab-Allokators.
Eine Reihe von optimierten Datenstrukturen wurden zusätzlich zum Allzweckzuordner implementiert, um den Speicherbedarf zu reduzieren.
4) Welche Synchronisierungstechniken werden verwendet, um trotz konkurrierender Lese-/Schreibvorgänge einen hohen Durchsatz zu erreichen?
Redis ist eine Singlethread-Ereignisschleife, daher muss keine Synchronisierung durchgeführt werden, da alle Befehle serialisiert werden. Einige Threads laufen jetzt auch für interne Zwecke im Hintergrund. In den seltenen Fällen, in denen sie auf die vom Hauptthread verwalteten Daten zugreifen, werden klassische Pthread-Synchronisationsprimitive verwendet (z. B. Mutexe). Aber 100 % der Datenzugriffe im Auftrag mehrerer Client-Verbindungen erfordern keine Synchronisierung.
Weitere Informationen finden Sie dort:Redis ist Single-Threaded, wie macht es dann gleichzeitige I/O?
Was ist der Unterschied zwischen einer Plain-Vanilla-Implementierung einer Maschine mit In-Memory-Cache und einem Server, der auf Befehle reagieren kann, und einer Redis-Box?
Es gibt keinen Unterschied. Redis ist eine Plain-Vanilla-Implementierung einer Maschine mit In-Memory-Cache und Server, die auf Befehle reagieren kann. Aber es ist eine richtig gemachte Implementierung:
- unter Verwendung des Single-Threaded-Event-Loop-Modells
- unter Verwendung einfacher und minimalistischer Datenstrukturen, die für ihre entsprechenden Anwendungsfälle optimiert sind
- bietet eine Reihe von Befehlen, die sorgfältig ausgewählt wurden, um Minimalismus und Nützlichkeit in Einklang zu bringen
- ständiges Streben nach der besten Rohleistung
- gut an moderne OS-Mechanismen angepasst
- Mehrere Persistenz-Mechanismen bereitzustellen, weil der Ansatz "eine Größe passt für alle" nur ein Traum ist.
- Bereitstellung der Bausteine für HA-Mechanismen (z. B. Replikationssystem)
- Vermeidung des Stapelns nutzloser Abstraktionsschichten wie Pfannkuchen
- was zu einer sauberen und verständlichen Codebasis führt, mit der jeder gute C-Entwickler vertraut sein kann