W dokumentacji Redis znajduje się mnóstwo informacji, aby zrozumieć, jak to działa. Teraz, aby odpowiedzieć konkretnie na Twoje pytania:
1) Jak są utrzymywane połączenia?
Połączenia są utrzymywane i zarządzane za pomocą pętli zdarzeń ae (zaprojektowanej przez autora Redis). Wszystkie operacje we/wy sieci nie są blokowane. Możesz postrzegać ae jako minimalistyczną implementację wykorzystującą najlepszy mechanizm demultipleksowania we/wy sieci na platformie (epoll dla Linuxa, kqueue dla BSD, itd.), podobnie jak libevent, libev, libuv, itd....
2) Czy połączenia to TCP czy HTTP?
Połączenia są realizowane przez TCP przy użyciu protokołu Redis, który jest prostym, zorientowanym tekstowo protokołem zgodnym z telnetem, obsługującym dane binarne. Ten protokół jest zazwyczaj bardziej wydajny niż HTTP.
3) Jak zarządzana jest pamięć?
Pamięć jest zarządzana w oparciu o alokator pamięci ogólnego przeznaczenia. Na niektórych platformach jest to alokator pamięci systemowej. Na niektórych innych platformach (w tym Linux) wybrano jemalloc, ponieważ zapewnia dobrą równowagę między zużyciem procesora, obsługą współbieżności, fragmentacją i zużyciem pamięci. Kod źródłowy jemalloc jest częścią dystrybucji Redis.
W przeciwieństwie do innych produktów (takich jak memcached) w Redis nie ma implementacji alokatora płyt.
Szereg zoptymalizowanych struktur danych zostało zaimplementowanych na szczycie alokatora ogólnego przeznaczenia w celu zmniejszenia zużycia pamięci.
4) Jakie techniki synchronizacji są używane do osiągnięcia wysokiej przepustowości pomimo konkurencyjnego odczytu/zapisu?
Redis jest jednowątkową pętlą zdarzeń, więc nie trzeba wykonywać synchronizacji, ponieważ wszystkie polecenia są serializowane. Teraz niektóre wątki działają również w tle do celów wewnętrznych. W rzadkich przypadkach, gdy uzyskują dostęp do danych zarządzanych przez wątek główny, używane są klasyczne prymitywy synchronizacji pthread (na przykład muteksy). Jednak 100% dostępu do danych w imieniu wielu połączeń klientów nie wymaga synchronizacji.
Możesz tam znaleźć więcej informacji:Redis jest jednowątkowy, więc jak wykonuje współbieżne I/O?
Jaka jest różnica między zwykłą waniliową implementacją maszyny z pamięcią podręczną i serwerem, który może odpowiadać na polecenia, a skrzynką Redis?
Nie ma różnicy. Redis to zwykła waniliowa implementacja maszyny z pamięcią podręczną i serwerem, który może odpowiadać na polecenia. Ale jest to implementacja wykonana prawidłowo:
- przy użyciu modelu pętli zdarzeń jednowątkowych
- przy użyciu prostych i minimalistycznych struktur danych zoptymalizowanych pod kątem odpowiednich przypadków użycia
- oferując zestaw poleceń starannie dobranych w celu zrównoważenia minimalizmu i użyteczności
- nieustanne ukierunkowanie na najlepszą surową wydajność
- dobrze przystosowany do nowoczesnych mechanizmów systemu operacyjnego
- zapewnienie wielu mechanizmów trwałości, ponieważ podejście „jeden rozmiar pasuje do wszystkich” jest tylko marzeniem.
- dostarczanie bloków konstrukcyjnych dla mechanizmów HA (na przykład systemu replikacji)
- unikanie układania bezużytecznych warstw abstrakcji, takich jak naleśniki
- w wyniku czego otrzymujemy czystą i zrozumiałą bazę kodu, z którą każdy dobry programista C może czuć się komfortowo