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.