Il y a une mine d'informations dans la documentation Redis pour comprendre comment cela fonctionne. Maintenant, pour répondre précisément à vos questions :
1) Comment les connexions sont-elles maintenues ?
Les connexions sont maintenues et gérées à l'aide de la boucle d'événements ae (conçue par l'auteur Redis). Toutes les opérations d'E/S réseau sont non bloquantes. Vous pouvez voir ae comme une implémentation minimaliste utilisant le meilleur mécanisme de démultiplexage d'E/S réseau de la plate-forme (epoll pour Linux, kqueue pour BSD, etc ...) tout comme libevent, libev, libuv, etc ...
2) Les connexions sont-elles TCP ou HTTP ?
Les connexions sont TCP à l'aide du protocole Redis, qui est un simple protocole orienté texte compatible telnet prenant en charge les données binaires. Ce protocole est généralement plus efficace que HTTP.
3) Comment la mémoire est-elle gérée ?
La mémoire est gérée en s'appuyant sur un répartiteur de mémoire à usage général. Sur certaines plates-formes, il s'agit en fait de l'allocateur de mémoire système. Sur certaines autres plates-formes (y compris Linux), jemalloc a été sélectionné car il offre un bon équilibre entre la consommation CPU, la prise en charge de la concurrence, la fragmentation et l'empreinte mémoire. Le code source de jemalloc fait partie de la distribution Redis.
Contrairement à d'autres produits (tels que memcached), il n'y a pas d'implémentation d'allocateur de slab dans Redis.
Un certain nombre de structures de données optimisées ont été implémentées en plus de l'allocateur à usage général pour réduire l'empreinte mémoire.
4) Quelles sont les techniques de synchronisation utilisées pour atteindre un débit élevé malgré les lectures/écritures concurrentes ?
Redis est une boucle d'événements à thread unique, il n'y a donc aucune synchronisation à effectuer puisque toutes les commandes sont sérialisées. Désormais, certains threads s'exécutent également en arrière-plan à des fins internes. Dans les rares cas où ils accèdent aux données gérées par le thread principal, des primitives de synchronisation pthread classiques sont utilisées (mutex par exemple). Mais 100 % des accès aux données effectués pour le compte de plusieurs connexions clientes ne nécessitent aucune synchronisation.
Vous pouvez trouver plus d'informations ici : Redis est monothread, alors comment fait-il les E/S simultanées ?
Quelle est la différence entre une implémentation standard d'une machine avec un cache mémoire et un serveur pouvant répondre aux commandes et une boîte Redis ?
Il n'y a pas de différence. Redis est une implémentation simple d'une machine avec un cache mémoire et un serveur qui peuvent répondre aux commandes. Mais c'est une implémentation qui est bien faite :
- en utilisant le modèle de boucle d'événement à thread unique
- en utilisant des structures de données simples et minimalistes optimisées pour leurs cas d'utilisation correspondants
- offrant un ensemble de commandes soigneusement choisies pour équilibrer minimalisme et utilité
- Cibler constamment les meilleures performances brutes
- bien adapté aux mécanismes des systèmes d'exploitation modernes
- fournir plusieurs mécanismes de persistance, car l'approche "taille unique" n'est qu'un rêve.
- fournir les éléments de base des mécanismes de haute disponibilité (système de réplication par exemple)
- éviter d'empiler des couches d'abstraction inutiles comme des crêpes
- résultant en une base de code propre et compréhensible avec laquelle tout bon développeur C peut être à l'aise