81 votes

Si Redis fait déjà partie de la pile, pourquoi Memcached est-il encore utilisé à côté de Redis ?

Redis peut faire tout ce que Memcached fournit (cache LRU, expiration des éléments, et maintenant la mise en grappe dans la version 3.x+, actuellement en version bêta) ou par des outils comme twemproxy. Les performances sont également similaires. De plus, Redis ajoute la persistance grâce à laquelle vous n'avez pas besoin de réchauffer le cache en cas de redémarrage du serveur.

Référence à d'anciennes réponses qui comparent Redis et Memcache, dont certaines favorisent Redis comme remplacement de Memcache (s'il est déjà présent dans la pile) :

Malgré cela, en étudiant les piles des grandes entreprises du web comme Instagram, Pinterest, Twitter etc, j'ai constaté qu'elles utilisent à la fois Memcached et Redis à des fins différentes, sans utiliser Redis pour le cache primaire. Le cache primaire est toujours Memcached, et Redis est utilisé pour son cache logique basé sur les structures de données.

En 2014, pourquoi memcached vaut-il encore la peine d'être ajouté comme composant supplémentaire dans votre pile, alors que vous avez déjà un composant Redis qui peut faire tout ce que memcached peut faire ? Quels sont les points favorables qui incitent les architectes/ingénieurs à toujours inclure memcached en dehors de Redis déjà existant ?

116voto

antirez Points 9894

La principale raison pour laquelle je vois aujourd'hui un cas d'utilisation de memcached par rapport à Redis est l'efficacité supérieure de la mémoire que vous devriez être en mesure d'obtenir avec simple Mise en cache des fragments HTML (ou applications similaires). Si vous devez stocker différents champs de vos objets dans différentes clés memcached, alors les hachages Redis seront plus efficaces en termes de mémoire, mais lorsque vous avez un grand nombre de paires clé -> simple_string, memcached devrait être capable de vous donner plus d'éléments par mégaoctet.

D'autres choses qui sont de bons points sur memcached :

  • C'est un morceau de code très simple, donc si vous avez juste besoin de la fonctionnalité qu'il fournit, c'est une alternative raisonnable je suppose, mais je ne l'ai jamais utilisé en production.
  • Il est multithread, donc si vous avez besoin d'évoluer dans une configuration à boîte unique, c'est une bonne chose et vous devez parler avec une seule instance.

Je pense que Redis en tant que cache prend de plus en plus de sens à mesure que les gens s'orientent vers la mise en cache intelligente ou lorsqu'ils essaient de préserver la structure des données mises en cache via les structures de données Redis.

Comparaison entre Redis LRU et memcached LRU.

Memcached et Redis n'effectuent pas de véritables évictions LRU, mais seulement une approximation de celles-ci.

L'éviction de Memcache se fait par classe de taille et dépend des détails de mise en œuvre de son allocateur de dalle. Par exemple, si vous voulez ajouter un objet qui entre dans une classe de taille donnée, memcached essaiera de supprimer les objets expirés / non utilisés récemment dans cette classe, au lieu d'essayer une tentative globale pour comprendre quel est l'objet, indépendamment de sa taille, qui est le meilleur candidat.

Redis essaye plutôt de choisir un bon objet comme candidat à l'éviction lorsque les maxmemory est atteinte, elle examine tous les objets, quelle que soit la classe de taille, mais n'est capable de fournir qu'un objet approximativement bon, et non pas le meilleur objet avec le plus grand temps d'inactivité.

Redis procède de la sorte en échantillonnant quelques objets et en choisissant celui qui est resté inactif (non accédé) le plus longtemps. Depuis Redis 3.0 (actuellement en version bêta) l'algorithme a été amélioré et prend également un bon pool de candidats à travers les évictions, donc l'approximation a été améliorée. Dans le Dans la documentation de Redis, vous trouverez une description et des graphiques détaillant son fonctionnement. .

Pourquoi memcached a une meilleure empreinte mémoire que Redis pour les cartes simples de type chaîne -> chaîne.

Redis est un logiciel plus complexe, les valeurs dans Redis sont donc stockées d'une manière plus similaire aux objets dans un langage de programmation de haut niveau : elles ont un type associé, un encodage, un comptage de référence pour la gestion de la mémoire. Cela rend la structure interne de Redis bonne et gérable, mais a une surcharge par rapport à memcached qui ne traite que des chaînes de caractères.

Quand Redis commence à être plus efficace en termes de mémoire

Redis est capable de stocker de petits types de données agrégées d'une manière spéciale permettant d'économiser de la mémoire. Par exemple, un petit hachage Redis représentant un objet, est stocké en interne non pas avec une table de hachage, mais comme un blob unique binaire. Ainsi, la définition de plusieurs champs par objet dans un hash est plus efficace que le stockage de N clés séparées dans memcached.

Vous pouvez, en fait, stocker un objet dans memcached comme un seul blob JSON (ou encodé binairement), mais contrairement à Redis, cela ne vous permettra pas de récupérer ou de mettre à jour des champs indépendants.

L'avantage de Redis dans le contexte de la mise en cache intelligente.

En raison des structures de données de Redis, le modèle habituel utilisé avec memcached, qui consiste à détruire les objets lorsque le cache est invalidé, pour les recréer ultérieurement à partir de la base de données, est une façon primitive d'utiliser Redis.

Par exemple, imaginons que vous ayez besoin de mettre en cache les N dernières nouvelles postées sur Hacker News afin d'alimenter la section "Newest" du site. Ce que vous faites avec Redis est de prendre une liste (plafonnée à M éléments) avec les nouvelles les plus récentes insérées. Si vous utilisez un autre magasin pour vos données, et Redis comme cache, ce que vous faites est d'alimenter les deux les vues (Redis et la BD) lorsqu'un nouvel élément est posté. Il n'y a pas d'invalidation du cache.

Cependant, l'application peut toujours avoir une logique qui fait que si la liste Redis est vide, par exemple après un démarrage, la vue initiale peut être recréée à partir de la base de données.

En utilisant la mise en cache intelligente, il est possible d'effectuer la mise en cache avec Redis d'une manière plus efficace par rapport à memcached, mais tous les problèmes ne sont pas adaptés à ce modèle. Par exemple, la mise en cache des fragments HTML peut ne pas bénéficier de cette technique.

13voto

Itamar Haber Points 2317

Les habitudes sont difficiles à perdre :)

Plus sérieusement, il y a deux raisons principales - à ma connaissance - pour lesquelles Memcached est toujours utilisé :

  1. Legacy - il y a des développeurs qui sont à l'aise et familiers avec Memcached, ainsi que des applications qui le supportent. Cela signifie également qu'il s'agit d'une technologie mature et bien testée.
  2. Mise à l'échelle - Memcached standard est facilement extensible horizontalement, tandis que Redis (jusqu'à la v3, qui sera bientôt disponible) nécessite plus de travail à cette fin (c'est-à-dire le sharding).

Cependant :

  1. Re. legacy - étant donné la robustesse de Redis (structures de données, commandes, persistance...), le fait qu'il soit activement développé et les clients dans tous les langages imaginables - les nouvelles applications sont généralement développé avec elle.
  2. Mise à l'échelle - outre la v3 à venir, il existe des solutions qui peuvent faciliter la mise à l'échelle. Par exemple, Redis Cloud offre une mise à l'échelle transparente sans perte de données ni interruption de service. Une autre approche populaire de mise à l'échelle/sharding de Redis est la suivante twemproxy .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X