Quelqu'un peut-il donner des exemples de cas d'utilisation où vous bénéficieriez d'utiliser Redis et MongoDB conjointement?
Redis et MongoDB peuvent être utilisés avec de bons résultats. Craiglist est une entreprise bien connue pour exécuter MongoDB et Redis (avec MySQL et Sphinx). Voir cette présentation de Jeremy Zawodny.
MongoDB est intéressant pour les données persistantes, orientées document, indexées de diverses manières. Redis est plus intéressant pour les données volatiles ou les données semi-persistantes sensibles à la latence.
Voici quelques exemples d'utilisation concrète de Redis au-dessus de MongoDB.
MongoDB pré-2.2 n'a pas encore de mécanisme d'expiration. Les collections plafonnées ne peuvent pas vraiment être utilisées pour implémenter un vrai TTL. Redis dispose d'un mécanisme d'expiration basé sur TTL, ce qui facilite le stockage de données volatiles. Par exemple, les sessions utilisateur sont généralement stockées dans Redis, tandis que les données utilisateur sont stockées et indexées dans MongoDB. Notez que MongoDB 2.2 a introduit un mécanisme d'expiration de faible précision au niveau de la collecte (à utiliser pour purger les données par exemple).
Redis fournit un type de données d'ensemble pratique et ses opérations associées (union, intersection, différence sur plusieurs ensembles, etc ...). Il est assez facile d'implémenter un moteur de recherche ou d'étiquetage à facettes de base en plus de cette fonctionnalité, qui est un ajout intéressant aux capacités d'indexation plus traditionnelles de MongoDB.
Redis prend en charge les opérations pop de blocage efficaces sur les listes. Cela peut être utilisé pour implémenter un système de mise en file d'attente distribuée ad hoc. Il est plus flexible que les curseurs MongoDB IMO, car une application backend peut écouter plusieurs files d'attente avec un délai d'attente, transférer des éléments vers une autre file d'attente atomiquement, etc ... Si l'application nécessite une certaine file d'attente, il est logique de stocker la file d'attente dans Redis et conservez les données fonctionnelles persistantes dans MongoDB.
Redis propose également un mécanisme pub/sub. Dans une application distribuée, un système de propagation d'événements peut être utile. Il s'agit là encore d'un excellent cas d'utilisation pour Redis, tandis que les données persistantes sont conservées dans MongoDB.
Parce qu'il est beaucoup plus facile de concevoir un modèle de données avec MongoDB qu'avec Redis (Redis est plus bas niveau), il est intéressant de bénéficier de la flexibilité de MongoDB pour les principales données persistantes, et des fonctionnalités supplémentaires fournies par Redis (faible latence , expiration des éléments, files d'attente, pub/sub, blocs atomiques, etc ...). C'est en effet une bonne combinaison.
Veuillez noter que vous ne devez jamais exécuter un serveur Redis et MongoDB sur la même machine. La mémoire MongoDB est conçue pour être échangée, contrairement à Redis. Si MongoDB déclenche une activité d'échange, les performances de Redis seront catastrophiques. Ils doivent être isolés sur différents nœuds.
Évidemment, il y a loin plus de différences que cela, mais pour un aperçu extrêmement élevé:
Pour les cas d'utilisation:
Techniquement:
Il y a un certain chevauchement, mais il est extrêmement courant d'utiliser les deux. Voici pourquoi:
Redis peut être utilisé en remplacement d'un magasin de données traditionnel, mais il est le plus souvent utilisé avec un autre magasin de données "long" normal, comme Mongo, Postgresql, MySQL, etc.
Redis fonctionne parfaitement avec MongoDB en tant que serveur de mise en cache. Voici ce qui se passe.
Chaque fois que la mangouste émet une requête de cache, elle passe d'abord au serveur de cache.
Le serveur de cache vérifiera si cette requête exacte a déjà été émise auparavant.
Si ce n'est pas le cas, le serveur de cache prendra la requête, envoyez-la à mongodb et Mongo exécutera la requête.
Nous prendrons ensuite le résultat de cette requête, il retournera ensuite au serveur de cache, le serveur de cache stockera le résultat de la requête sur lui-même.
Il dira que chaque fois que j'exécuterai cette requête, j'obtiens cette réponse et donc sa va maintenir un enregistrement entre les requêtes qui sont émises et les réponses qui reviennent de ces requêtes.
Le serveur de cache prendra la réponse et la renverra à mangouste, la mangouste la donnera à exprimer et elle finira par se retrouver dans l'application.
Chaque fois que la même requête exacte est émise à nouveau, mangouste enverra la même requête au serveur de cache, mais si le serveur de cache voit que cette requête a été émise avant, il n'enverra pas la requête sur mongodb, au lieu de cela, il prendra la réponse à la requête qu'il a eu la dernière fois et l'envoyer immédiatement à mangouste. Il n'y a pas d'indices ici, pas de scan complet de la table, rien.
Nous faisons une simple recherche pour dire que cette requête a été exécutée? Oui? D'accord, prenez la demande et renvoyez-la immédiatement et n'envoyez rien à Mongo.
Nous avons le serveur mangouste, le serveur cache (Redis) et Mongodb.
Sur le serveur de cache, il peut y avoir une banque de données avec un type de valeur de clé de magasin de données où toutes les clés sont un type de requête émis avant et la valeur le résultat de cette requête.
Alors peut-être que nous recherchons un tas de blogs par _id.
Alors peut-être que les clés ici sont le _id des enregistrements que nous avons consultés auparavant.
Imaginons donc que mangouste émette une nouvelle requête où il essaie de trouver un article de blog avec _id de 123, la requête circule dans le serveur de cache, le serveur de cache vérifiera si elle a un résultat pour une requête qui recherchait un _id de 123.
S'il n'existe pas dans le serveur de cache, cette requête est prise et envoyée à l'instance mongodb. Mongodb exécutera la requête, obtiendra une réponse et la renverra.
Ce résultat est renvoyé au serveur de cache qui prend ce résultat et le renvoie immédiatement à mangouste afin que nous obtenions une réponse aussi rapide que possible.
Juste après cela, le serveur de cache prendra également la requête émise et l'ajoutera à sa collection de requêtes qui ont été émises et prendra le résultat de la requête et le stockera directement contre la requête.
Nous pouvons donc imaginer qu'à l'avenir, nous émettrons à nouveau la même requête, elle atteindra le serveur de cache, elle examinera toutes les clés dont elle dispose et dit oh j'ai déjà trouvé ce blog, il n'atteint pas Mongo, il suffit de prendre le résultat de la requête et l'envoie directement à mangouste.
Nous ne faisons pas de logique de requête complexe, pas d'indices, rien de tout cela. C'est aussi rapide que possible. C'est une simple recherche de valeur clé.
C'est un aperçu du fonctionnement du serveur de cache (Redis) avec MongoDB.
Maintenant, il y a d'autres préoccupations. Sommes-nous en train de mettre en cache les données pour toujours? Comment mettons-nous à jour les enregistrements?
Nous ne voulons pas toujours stocker des données dans le cache et lire à partir du cache.
Le serveur de cache n'est utilisé pour aucune action d'écriture. La couche de cache est uniquement utilisée pour lire les données. Si nous écrivons des données, l'écriture ira toujours à l'instance mongodb et nous devons nous assurer que chaque fois que nous écrivons des données, nous effaçons toutes les données stockées sur le serveur de cache qui sont liées à l'enregistrement que nous venons de mettre à jour dans Mongo.