Pourquoi Redis bat Memcached pour la mise en cache

Memcached ou Redis? C'est une question qui se pose presque toujours dans toute discussion sur l'optimisation des performances d'une application Web moderne basée sur une base de données. Lorsque les performances doivent être améliorées, la mise en cache est souvent la première étape prise, et Memcached ou Redis sont généralement les premiers endroits à activer.

Ces moteurs de cache renommés partagent un certain nombre de similitudes, mais ils présentent également des différences importantes. Redis, le plus récent et le plus polyvalent des deux, est presque toujours le meilleur choix.

Redis vs Memcached pour la mise en cache

Commençons par les similitudes. Memcached et Redis servent tous deux de magasins de données clé-valeur en mémoire, bien que Redis soit plus précisément décrit comme un magasin de structure de données. Memcached et Redis appartiennent à la famille NoSQL de solutions de gestion de données et sont tous deux basés sur un modèle de données clé-valeur. Ils conservent tous les deux toutes les données dans la RAM, ce qui les rend bien sûr extrêmement utiles en tant que couche de mise en cache. En termes de performances, les deux magasins de données sont également remarquablement similaires, présentant des caractéristiques (et des métriques) presque identiques en termes de débit et de latence.

Memcached et Redis sont des projets open source matures et extrêmement populaires. Memcached a été initialement développé par Brad Fitzpatrick en 2003 pour le site Web LiveJournal. Depuis, Memcached a été réécrit en C (l'implémentation d'origine était en Perl) et placé dans le domaine public, où il est devenu une pierre angulaire des applications Web modernes. Le développement actuel de Memcached est axé sur la stabilité et les optimisations plutôt que sur l'ajout de nouvelles fonctionnalités.

Redis a été créé par Salvatore Sanfilippo en 2009, et Sanfilippo reste le développeur principal du projet aujourd'hui. Redis est parfois décrit comme «Memcached sous stéroïdes», ce qui n'est guère surprenant étant donné que certaines parties de Redis ont été construites en réponse aux leçons tirées de l'utilisation de Memcached. Redis a plus de fonctionnalités que Memcached et est donc plus puissant et flexible.

Utilisés par de nombreuses entreprises et dans d'innombrables environnements de production critiques, Memcached et Redis sont pris en charge par des bibliothèques clientes dans tous les langages de programmation imaginables et sont inclus dans une multitude de packages pour les développeurs. En fait, c'est une pile Web rare qui n'inclut pas de prise en charge intégrée pour Memcached ou Redis.

Pourquoi Memcached et Redis sont-ils si populaires? Non seulement ils sont extrêmement efficaces, mais ils sont également relativement simples. Démarrer avec Memcached ou Redis est considéré comme un travail facile pour un développeur. Cela ne prend que quelques minutes pour les configurer et les faire fonctionner avec une application. Ainsi, un petit investissement en temps et en efforts peut avoir un impact immédiat et dramatique sur les performances, généralement de plusieurs ordres de grandeur. Une solution simple avec un énorme avantage; c'est aussi proche de la magie que possible.

Quand utiliser Memcached

Memcached peut être préférable lors de la mise en cache de données relativement petites et statiques, telles que des fragments de code HTML. La gestion de la mémoire interne de Memcached, bien qu'elle ne soit pas aussi sophistiquée que celle de Redis, est plus efficace dans les cas d'utilisation les plus simples car elle consomme relativement moins de ressources mémoire pour les métadonnées. Les chaînes (le seul type de données pris en charge par Memcached) sont idéales pour stocker des données uniquement lues, car les chaînes ne nécessitent aucun traitement supplémentaire.

Les grands ensembles de données impliquent souvent des données sérialisées, qui nécessitent toujours plus d'espace pour stocker. Alors que Memcached est effectivement limité au stockage des données sous leur forme sérialisée, les structures de données dans Redis peuvent stocker tout aspect des données de manière native, réduisant ainsi la surcharge de sérialisation.

Le deuxième scénario dans lequel Memcached a un avantage sur Redis est la mise à l'échelle. Comme Memcached est multithread, vous pouvez facilement évoluer en lui donnant plus de ressources de calcul, mais vous perdrez une partie ou la totalité des données mises en cache (selon que vous utilisez un hachage cohérent). Redis, qui est principalement monothread, peut évoluer horizontalement via le clustering sans perte de données. Le clustering est une solution de mise à l'échelle efficace, mais il est comparativement plus complexe à configurer et à exploiter.

Quand utiliser Redis

Vous voudrez presque toujours utiliser Redis en raison de ses structures de données. Avec Redis comme cache, vous gagnez beaucoup de puissance (comme la possibilité d'ajuster le contenu et la durabilité du cache) et une plus grande efficacité globale. Une fois que vous utilisez les structures de données, l'augmentation de l'efficacité devient considérable pour des scénarios d'application spécifiques.

La supériorité de Redis est évidente dans presque tous les aspects de la gestion du cache. Les caches utilisent un mécanisme appelé expulsion de données pour faire de la place pour de nouvelles données en supprimant les anciennes données de la mémoire. Le mécanisme d'éviction des données de Memcached utilise un algorithme le moins récemment utilisé et expulse quelque peu arbitrairement les données dont la taille est similaire aux nouvelles données.

Redis, en revanche, permet un contrôle précis de l'expulsion, vous permettant de choisir parmi six politiques d'expulsion différentes. Redis utilise également des approches plus sophistiquées pour la gestion de la mémoire et la sélection des candidats à l'expulsion. Redis prend en charge l'expulsion paresseuse et active, où les données sont expulsées uniquement lorsque plus d'espace est nécessaire ou de manière proactive. 

Redis vous offre une flexibilité beaucoup plus grande concernant les objets que vous pouvez mettre en cache. Alors que Memcached limite les noms de clé à 250 octets et ne fonctionne qu'avec des chaînes simples, Redis autorise les noms de clé et les valeurs à atteindre 512 Mo chacun, et ils sont sécurisés pour les binaires. De plus, Redis dispose de cinq structures de données principales parmi lesquelles choisir, ouvrant un monde de possibilités au développeur d'applications grâce à la mise en cache intelligente et à la manipulation des données mises en cache.

Redis pour la persistance des données

L'utilisation des structures de données Redis peut simplifier et optimiser plusieurs tâches, non seulement lors de la mise en cache, mais même lorsque vous souhaitez que les données soient persistantes et toujours disponibles. Par exemple, au lieu de stocker des objets sous forme de chaînes sérialisées, les développeurs peuvent utiliser un hachage Redis pour stocker les champs et les valeurs d'un objet et les gérer à l'aide d'une seule clé. Redis Hash évite aux développeurs d'avoir à récupérer la chaîne entière, à la désérialiser, à mettre à jour une valeur, à resérialiser l'objet et à remplacer la chaîne entière dans le cache par sa nouvelle valeur pour chaque mise à jour triviale, ce qui signifie une consommation de ressources réduite et des performances accrues.

D'autres structures de données proposées par Redis (telles que des listes, des ensembles, des ensembles triés, des hyperloglogs, des bitmaps et des index géospatiaux) peuvent être utilisées pour implémenter des scénarios encore plus complexes. Les ensembles triés pour l'ingestion et l'analyse de données de séries chronologiques sont un autre exemple de structure de données Redis qui offre une complexité considérablement réduite et une consommation de bande passante moindre.

Un autre avantage important de Redis est que les données qu'il stocke ne sont pas opaques, de sorte que le serveur peut les manipuler directement. Une part considérable des plus de 180 commandes disponibles dans Redis sont consacrées aux opérations de traitement des données et à l'intégration de la logique dans le magasin de données lui-même via des scripts Lua côté serveur. Ces commandes et scripts utilisateur intégrés vous offrent la flexibilité de gérer les tâches de traitement des données directement dans Redis sans avoir à expédier les données à travers le réseau vers un autre système pour traitement.

Redis offre une persistance des données optionnelle et réglable conçue pour amorcer le cache après un arrêt planifié ou une panne non planifiée. Bien que nous ayons tendance à considérer les données dans les caches comme volatiles et transitoires, les données persistantes sur le disque peuvent être très utiles dans les scénarios de mise en cache. La disponibilité des données du cache pour le chargement immédiatement après le redémarrage permet un préchauffage du cache beaucoup plus court et supprime la charge impliquée dans le repeuplement et le recalcul du contenu du cache à partir du magasin de données principal.

Réplication des données en mémoire Redis 

Redis peut également répliquer les données qu'il gère. La réplication peut être utilisée pour implémenter une configuration de cache hautement disponible capable de résister aux pannes et de fournir un service ininterrompu à l'application. Une défaillance du cache n'est que légèrement inférieure à celle d'une application en termes d'impact sur l'expérience utilisateur et les performances de l'application.Par conséquent, disposer d'une solution éprouvée garantissant le contenu du cache et la disponibilité du service est un avantage majeur dans la plupart des cas.

Enfin, en termes de visibilité opérationnelle, Redis fournit une multitude de mesures et une multitude de commandes introspectives permettant de surveiller et de suivre l'utilisation et les comportements anormaux. Des statistiques en temps réel sur tous les aspects de la base de données, l'affichage de toutes les commandes en cours d'exécution, la liste et la gestion des connexions client - Redis a tout cela et plus encore.

Lorsque les développeurs réalisent l'efficacité des capacités de persistance et de réplication en mémoire de Redis, ils l'utilisent souvent comme base de données de premier répondant, généralement pour analyser et traiter des données à haute vitesse et fournir des réponses à l'utilisateur tandis qu'une base de données secondaire (souvent plus lente) maintient un enregistrement historique de ce qui s'est passé. Lorsqu'il est utilisé de cette manière, Redis peut également être idéal pour les cas d'utilisation d'analyse.

Redis pour l'analyse de données

Trois scénarios d'analyse viennent immédiatement à l'esprit. Dans le premier scénario, lorsque vous utilisez quelque chose comme Apache Spark pour traiter de manière itérative de grands ensembles de données, vous pouvez utiliser Redis comme couche de diffusion pour les données précédemment calculées par Spark. Dans le deuxième scénario, l'utilisation de Redis comme magasin de données partagé, en mémoire et distribué peut accélérer les vitesses de traitement Spark d'un facteur de 45 à 100. Enfin, un scénario trop courant est celui dans lequel les rapports et les analyses doivent être personnalisables en l'utilisateur, mais la récupération de données à partir de magasins de données par lots (comme Hadoop ou un SGBDR) prend trop de temps. Dans ce cas, un magasin de structure de données en mémoire tel que Redis est le seul moyen pratique d'obtenir des temps de pagination et de réponse inférieurs à la milliseconde.

Lors de l'utilisation d'ensembles de données opérationnelles ou de charges de travail d'analyse extrêmement volumineux, l'exécution de tout ce qui est en mémoire peut ne pas être rentable. Pour atteindre des performances inférieures à la milliseconde à moindre coût, Redis Labs a créé une version de Redis qui fonctionne sur une combinaison de RAM et de mémoire flash, avec la possibilité de configurer les ratios RAM / flash. Bien que cela ouvre plusieurs nouvelles voies pour accélérer le traitement de la charge de travail, cela donne également aux développeurs la possibilité d'exécuter simplement leur «cache sur Flash».

Les logiciels open source continuent de fournir certaines des meilleures technologies disponibles aujourd'hui. Lorsqu'il s'agit d'améliorer les performances des applications grâce à la mise en cache, Redis et Memcached sont les candidats les plus établis et les plus éprouvés en production. Cependant, étant donné les fonctionnalités plus riches de Redis, sa conception plus avancée, ses nombreuses utilisations potentielles et une meilleure rentabilité à grande échelle, Redis devrait être votre premier choix dans presque tous les cas.

---

Itamar Haber (@itamarhaber) est l'avocat principal des développeurs chez Redis Labs, qui propose Memcached et Redis en tant que services cloud entièrement gérés pour les développeurs. Son expérience variée comprend le développement et la gestion de produits logiciels et des postes de direction chez Xeround, Etagon, Amicada et MNS Ltd. of Science in Computer Science.

Le New Tech Forum offre un lieu pour explorer et discuter des technologies d'entreprise émergentes avec une profondeur et une ampleur sans précédent. La sélection est subjective, basée sur notre choix des technologies que nous pensons importantes et qui intéressent le plus les lecteurs. n'accepte pas les supports marketing pour la publication et se réserve le droit de modifier tout le contenu fourni. Envoyez toutes vos demandes à [email protected]