Redis
 sql >> Base de données >  >> NoSQL >> Redis

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

La principale raison pour laquelle je considère aujourd'hui comme un cas d'utilisation pour memcached sur Redis est l'efficacité de la mémoire supérieure que vous devriez pouvoir obtenir avec plain Mise en cache des fragments HTML (ou applications similaires). Si vous avez besoin de stocker différents champs de vos objets dans différentes clés memcached, les hachages Redis seront plus efficaces en mémoire, mais lorsque vous avez un grand nombre de paires clé -> simple_string, memcached devrait pouvoir vous donner plus d'éléments par mégaoctet.

Autres choses qui sont de bons points à propos de 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îtier unique, c'est une bonne chose et vous n'avez besoin de parler qu'avec une seule instance.

Je pense que Redis en tant que cache prend de plus en plus de sens à mesure que les gens évoluent vers une 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 expulsions LRU, mais seulement une approximation de cela.

L'éviction de Memcache est une classe par taille et dépend des détails d'implémentation de son allocation de dalle. Par exemple, si vous souhaitez ajouter un élément qui correspond à une classe de taille donnée, memcached essaiera de supprimer les éléments expirés / non récemment utilisés dans cette classe, au lieu d'essayer une tentative globale pour comprendre ce qu'est l'objet, quel que soit son taille, qui est le meilleur candidat.

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

Pour ce faire, Redis échantillonne quelques objets, en choisissant celui qui est resté inactif (non consulté) le plus longtemps. Depuis Redis 3.0 (actuellement en version bêta), l'algorithme a été amélioré et prend également de bons pools de candidats à travers les expulsions, de sorte que l'approximation a été améliorée. Dans la documentation Redis, vous pouvez trouver une description et des graphiques avec des détails sur son fonctionnement.

Pourquoi memcached a une meilleure empreinte mémoire que Redis pour une chaîne simple -> mappages de chaînes.

Redis est un logiciel plus complexe, donc les valeurs dans Redis sont stockées d'une manière plus similaire aux objets dans un langage de programmation de haut niveau :elles ont un type, un encodage, un comptage de références associés 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.

Lorsque Redis commence à être plus économe en mémoire

Redis est capable de stocker de petits types de données agrégées d'une manière spéciale pour é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 sous la forme d'un blob binaire unique. Ainsi, définir plusieurs champs par objet dans un hachage est plus efficace que de stocker N clés séparées dans memcached.

Vous pouvez, en fait, stocker un objet dans memcached sous la forme d'un seul blob JSON (ou codé en binaire), 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 Redis, le modèle habituel utilisé avec memcached de destruction d'objets lorsque le cache est invalidé, pour le recréer ultérieurement à partir de la base de données, est une manière primitive d'utiliser Redis.

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

Cependant l'application peut toujours avoir une logique pour que si la liste Redis s'avère vide, par exemple après un démarrage, la vue initiale puisse être recréée à partir de la BD.

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