Memcached est-il un dinosaure par rapport à Redis? [fermé]


185

J'ai beaucoup travaillé avec Memcached ces dernières semaines et je viens de découvrir Redis. Quand j'ai lu cette partie de leur readme, j'ai soudainement ressenti une sensation de chaleur et de confort dans mon estomac:

Redis peut être utilisé comme memcached sur les stéroïdes car il est aussi rapide que memcached mais avec un certain nombre de fonctionnalités en plus. Comme Memcached, Redis prend également en charge la définition de délais d'expiration pour les clés afin que cette clé soit automatiquement supprimée lorsqu'un laps de temps donné s'écoule.

Cela semble incroyable. J'avais aussi trouvé cette page avec des benchmarks: http://www.ruturaj.net/redis-memcached-tokyo-tyrant-mysql-comparison

Donc, honnêtement - Memcache est-il vraiment ce vieux dinosaure qui est un mauvais choix du point de vue des performances par rapport à ce nouveau venu appelé Redis?

Je n'ai pas beaucoup entendu parler de Redis auparavant, d'où l'approche de ma question!



9
cette référence ruturaj ne mérite pas vraiment beaucoup d'attention
dsomnus

2
Nous avons commencé à expérimenter avec Membase au travail, et nous sommes heureux jusqu'à présent. Cependant, nous venons de Memcache, donc avoir une goutte de remplacement était un avantage appréciable
jayshao

2
Redis est aussi rapide que Memcached pour les benchmarks artificiels non réels. Cela ne veut pas dire que c'est lent - c'est certainement assez rapide pour la plupart des charges de travail, mais les choses plus rapides que Memcached ne révèlent que des bogues dans Memcached. Il est presque toujours goulot d'étranglement par le matériel ou une mauvaise conception des applications.
Dustin

4
Je suis surpris que le caractère sacré de la patrouille SO n'ait pas clos cette question comme n'étant ni appropriée ni utile.
Dogweather

Réponses:


74

Memcache est un excellent outil encore et TRÈS fiable.

au lieu de regarder ce problème du point de vue de savoir qui est le plus rapide dans la plage <100 ms, regardez les performances par «classe» du logiciel.

  • Utilise-t-il uniquement la RAM locale? -> le plus rapide
  • Utilise-t-il un ram distant? -> rapide
  • Utilise-t-il ram plus disque dur -> oh hurm.
  • N'utilise-t-il que le disque dur -> run!

3
Il n'y a aucune installation pour gérer la réplication avec Memcache que je connaisse. Memcache est purement destiné à être un cache. Si l'élément est purgé / perdu, il doit être reconstruit. Je ne l'ai jamais utilisé auparavant et je ne l'ai pas évalué, mais cela peut vous intéresser. code.google.com/p/memagent
Daniel

1
Membase prend en charge le protocole memcached mais également la persistance et la réplication.
Jim Ferrans

1
Récemment, j'ai vu Ethernet lié, sur 4 ports. 4 x 44 Mo / s. Cela rend la RAM encore plus précieuse, en supposant que vous puissiez utiliser Ethernet lié!
Daniel

1
Par souci de référence future, Facebook a récemment mcrouter open source, qui ajoute la réplication à Memcached. D'autres choses sont également datées (redis est super rapide maintenant, etc.), mais pour info si vous êtes ici cinq ans plus tard ...
dannysauer

bien quel est le point? les deux ne peuvent pas stocker un simple tableau json directement, le format d'échange de données le plus largement utilisé sur le Web, je n'ai aucune idée de ce qu'ils pensaient ... oh attendez peut-être que je devrais ajouter ReJSON car nativement personne ne se soucie de JSON dans le monde
PirateApp

205

Cela dépend de ce dont vous avez besoin, en général je pense que:

  • Vous ne devriez pas trop vous soucier des performances. Redis est plus rapide par cœur avec de petites valeurs, mais Memcached est capable d'utiliser plusieurs cœurs avec un seul exécutable et un seul port TCP sans l'aide du client. Memcached est également plus rapide avec de grandes valeurs de l'ordre de 100k. Redis a récemment beaucoup amélioré sur les grandes valeurs (branche instable) mais memcached est toujours plus rapide dans ce cas d'utilisation. Le point ici est le suivant: ni l'un ni l'autre ne sera probablement votre goulot d'étranglement pour la requête par seconde qu'ils peuvent fournir.
  • Vous devez vous soucier de l'utilisation de la mémoire. Pour les paires clé-valeur simples, Memcached est plus efficace en mémoire. Si vous utilisez des hachages Redis, Redis est plus efficace en mémoire. Dépend du cas d'utilisation.
  • Vous devez vous soucier de la persistance et de la réplication, deux fonctionnalités uniquement disponibles dans Redis. Même si votre objectif est de créer un cache, cela aide qu'après une mise à niveau ou un redémarrage, vos données soient toujours là.
  • Vous devez vous soucier du type d'opérations dont vous avez besoin. Dans Redis, il y a beaucoup d'opérations complexes, même en tenant compte du cas d'utilisation de la mise en cache, vous pouvez souvent faire beaucoup plus en une seule opération, sans nécessiter le traitement des données côté client (beaucoup d'E / S sont parfois nécessaires). Ces opérations sont souvent aussi rapides que GET et SET. Donc, si vous n'avez pas simplement besoin de GET / SET mais de choses plus complexes, Redis peut beaucoup vous aider (pensez à la mise en cache de la chronologie).

Sans un cas d'utilisation, il est difficile de choisir le moment, mais je pense que pour beaucoup de choses, Redis a du sens car même lorsque vous ne voulez pas l'utiliser comme base de données, étant beaucoup plus capable, vous pouvez résoudre plus de problèmes, pas seulement la mise en cache, mais même la messagerie, le classement, etc.

Ps bien sûr, je pourrais être partial puisque je suis le développeur principal du projet Redis.


67
+1 pour une grande divulgation à la fin
NateDSaint

6
Je ne sais pas s'il s'agit d'une erreur de langage, mais si vous indiquez "en général, je pense que vous ne devriez pas trop vous soucier de la performance", c'est un sujet de grave préoccupation. Redis peut être très bon pour certaines classes de problèmes mais, traditionnellement, Memcache a été utilisé spécifiquement pour résoudre des problèmes de performances avec des bases de données persistantes. Je pense également qu'une omission flagrante de votre liste est la maturité du produit. Memcache est un produit mature avec environ une décennie d'expérience. Redis est prometteur, mais n'existe que depuis 3 ans environ.
DougW

1
@DougW Vous sortez cette phrase de son contexte. Cela a beaucoup plus de sens quand vous lisez la phrase fermant le paragraphe juste après: "Le point ici est: ni l'un ni l'autre ne sera probablement votre goulot d'étranglement pour la requête par seconde qu'ils peuvent fournir"
Dinei

83

Donc, honnêtement - Memcache est-il vraiment ce vieux dinosaure qui est un mauvais choix du point de vue des performances par rapport à ce nouveau venu appelé Redis?

  • La comparaison de l'ensemble des fonctionnalités a alors Redisbeaucoup plus de fonctionnalités;
  • Comparer la facilité d'installation Redisest également beaucoup plus facile. Aucune dépendance requise;
  • Comparer le développement actif Redisest également préférable;
  • Je crois que memcachedc'est un peu plus rapide queRedis . Il ne touche pas du tout le disque;
  • Mon avis est que Redisc'est un meilleur produit que memcached.

31
redis ne touche le disque que si vous le lui demandez. Habituellement, il fait une fsync toutes les deux secondes environ -> vous ne le remarquerez pas
Marc Seeger

1
@Marc yup. Je crois aussi que vous pouvez lui dire de ne pas toucher du tout le disque, mais en standard, je crois qu'il se synchronise toujours en ce moment?
Alfred le

3
De plus, d'après mon expérience, Redis est un peu plus rapide que Memcached (lors de l'utilisation de Redis en mode mémoire uniquement). Antirez a fait un test ici antirez.com/post/redis-memcached-benchmark.html
Sune Rievers

10
GRANDE DIFFÉRENCE: Memcached est multi-thread et Redis ne l'est pas. Ainsi, bien que la latence d'une seule demande soit comparable, Memcached peut servir beaucoup plus de demandes lorsque la concurrence est élevée. Redis, quant à lui, atteindra son pic de performances avec seulement quelques requêtes simultanées car il n'utilise qu'un seul cœur / thread de processeur. La méthode suggérée pour contourner ce problème est d'exécuter plusieurs instances de Redis sur une machine avec un hachage cohérent, mais c'est une solution vraiment médiocre. Donc, si vous avez besoin d'une concurrence élevée et que vous avez un processeur multicœur (qui n'en a pas), Memcached est BEAUCOUP plus rapide.
ColinM

2
@Alfred, ce n'est pas un fait caché que Redis est monothread, c'est une décision de conception (simplicité plutôt que robustesse) de l'auteur. L'article auquel Dustin est lié ci-dessus est une preuve solide qu'il a un impact réel. J'ai aussi confirmé cela dans mes propres tests en utilisant Redis comme backend Zend_Cache; à mesure que la concurrence augmente, Redis se stabilisera assez rapidement par rapport à Memcached.
ColinM

46

Ce que fait Memcached que Redis ne fait pas, c'est l'éviction des valeurs la moins récemment utilisée du cache. Avec memcached, vous pouvez définir en toute sécurité autant de valeurs que vous le souhaitez, et lorsqu'elles débordent de mémoire, celles que vous n'avez pas utilisées récemment seront supprimées. Avec Redis, vous ne pouvez approximer cela qu'en définissant un délai d'expiration sur tout; lorsqu'il a besoin de libérer de la mémoire, il examinera trois clés aléatoires et supprimera celle qui est la plus proche d'expirer.

C'est la principale différence, si vous ne l'utilisez que comme cache.



13

Vous voudrez peut-être également regarder Membase.

http://www.northscale.com/products/membase_server.html

Je ne l'ai pas utilisé, mais il semble être similaire à Redis en ce sens qu'il s'agit d'un magasin KV centré sur la mémoire avec persistance. Les principales différences par rapport à ce que je peux voir sont:

  • Redis a beaucoup plus de capacités de manipulation de données (ensembles ordonnés, etc.)
  • Redis a un projet Redis Cluster en attente pour ajouter une évolutivité horizontale
  • Redis dispose d'un seul niveau de déchargement de données sur disque (VM) basé sur un algorithme hybride qui prend en compte à la fois le LRU et la taille de l'objet.

  • Membase utilise le protocole filaire Memcached - utile comme chemin de mise à niveau pour les applications existantes

  • Membase est configuré pour évoluer horizontalement en utilisant une approche de table de hachage distribuée
  • Membase peut prendre en charge plusieurs niveaux de déchargement de données en utilisant une approche LRU (très rarement utilisé sur le disque, un peu rarement des éléments vont au SSD, des éléments fréquents restent dans la RAM)
  • Pas sûr de la capacité TTL dans Membase.

Le choix peut dépendre de la mesure dans laquelle votre application peut tirer parti des fonctionnalités supplémentaires de manipulation des données dans Redis.


Salut Dean, merci pour votre message. Je vais certainement le vérifier. Puis-je utiliser Membase en PHP?
Industriel

4
Puisque Membase utilise le protocole memcached, n'importe lequel des clients memcached devrait fonctionner: wiki.membase.org/bin/view/Main/Clients
HikeOnPast

Membase prend en charge TTL. Toutes les implémentations de Memcache prennent en charge un délai d'expiration. github.com/memcached/memcached/blob/master/doc/protocol.txt#L79
Saurav

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.