Quand à Redis? Quand à MongoDB? [fermé]

466

Ce que je veux, ce n'est pas une comparaison entre Redis et MongoDB. Je sais qu'ils sont différents; les performances et l'API sont totalement différentes.

Redis est très rapide, mais l'API est très «atomique». MongoDB consommera plus de ressources, mais l'API est très très facile à utiliser et j'en suis très satisfait.

Ils sont tous les deux géniaux, et je veux utiliser Redis dans le déploiement autant que possible, mais c'est difficile à coder. Je veux utiliser MongoDB dans le développement autant que possible, mais il a besoin d'une machine coûteuse.

Alors, que pensez-vous de l'utilisation des deux? Quand choisir Redis? Quand choisir MongoDB?

guilin 桂林
la source

Réponses:

308

Je dirais que cela dépend du type d'équipe de développement que vous êtes et des besoins de votre application.

Par exemple, si vous avez besoin de beaucoup de requêtes , cela signifie principalement que vos développeurs utiliseraient plus Redis, où vos données pourraient être stockées dans diverses structures de données spécialisées, personnalisées pour chaque type d'objet pour plus d'efficacité. Dans MongoDB, les mêmes requêtes peuvent être plus faciles car la structure est plus cohérente entre vos données. D'un autre côté, dans Redis, la rapidité de la réponse à ces requêtes est la récompense du travail supplémentaire lié à la variété des structures avec lesquelles vos données peuvent être stockées.

MongoDB offre une simplicité, une courbe d'apprentissage beaucoup plus courte pour les développeurs ayant une expérience DB et SQL traditionnelle. Cependant, l'approche non traditionnelle de Redis nécessite plus d'efforts pour apprendre, mais une plus grande flexibilité.

Par exemple. Une couche de cache peut probablement être mieux implémentée dans Redis. Pour des données plus schématiques, MongoDB est meilleur. [Remarque: MongoDB et Redis sont techniquement sans schéma]

Si vous me demandez, mon choix personnel est Redis pour la plupart des exigences.

Enfin, j'espère que vous avez maintenant vu http://antirez.com/post/MongoDB-and-Redis.html

Shekhar
la source
16
fyi, mongodb est schemaless.
Özgür
18
MogoDB est sans schéma. et à mesure que les données stockées dans la base de données deviennent de plus en plus grandes, MongoDB prouve qu'elles sont beaucoup plus rapides que Redis. Redis n'est plus rapide que lorsque les données stockées sont petites.
Anderson
4
J'adore l'approche de MongoDB étant sans schéma et laissant ensuite aux auteurs ORM le soin d'implémenter des schémas pour ceux qui en ont besoin. Mongoose est un excellent ORM qui présente des schémas faciles à utiliser si vous en avez besoin :)
Chev
18
Vous devez savoir que la taille de la base de données redis est limitée par la quantité de RAM dans la machine. Plus grand que cela et vous devez penser au clustering qui est manuel et intensif.
Akash Agrawal
4
MongoDB n'applique pas un schéma, mais j'aimerais voir un cas où quelqu'un l'utilise sans schéma ... c'est tout comme vous définissez le mot schéma
Robbie Guilfoyle
236

Je viens de remarquer que cette question est assez ancienne. Néanmoins, je considère que les aspects suivants méritent d'être ajoutés:

  • Utilisez MongoDB si vous ne savez pas encore comment vous allez interroger vos données.

    MongoDB est adapté pour les Hackathons, les startups ou chaque fois que vous ne savez pas comment vous interrogerez les données que vous avez insérées. MongoDB ne fait aucune hypothèse sur votre schéma sous-jacent. Bien que MongoDB soit sans schéma et non relationnel, cela ne signifie pas qu'il n'y a aucun schéma du tout. Cela signifie simplement que votre schéma doit être défini dans votre application (par exemple en utilisant Mongoose). En plus de cela, MongoDB est idéal pour prototyper ou essayer des choses. Ses performances ne sont pas si bonnes et ne peuvent être comparées à Redis.

  • Utilisez Redis afin d'accélérer votre application existante.

    Redis peut être facilement intégré en tant que cache LRU . Il est très rare d'utiliser Redis en tant que système de base de données autonome (certaines personnes préfèrent le désigner comme un magasin de "valeurs-clés"). Des sites Web comme Craigslist utilisent Redis à côté de leur base de données principale . Antirez (développeur de Redis) a démontré en utilisant Lamernews qu'il est en effet possible d'utiliser Redis comme système de base de données autonome.

  • Redis ne fait aucune hypothèse sur la base de vos données.

    Redis fournit un tas de structures de données utiles (par exemple des ensembles, des hachages, des listes), mais vous devez définir explicitement comment vous souhaitez stocker vos données. Pour résumer, Redis et MongoDB peuvent être utilisés afin de réaliser des choses similaires. Redis est tout simplement plus rapide, mais ne convient pas au prototypage. C'est un cas d'utilisation où vous préféreriez généralement MongoDB. En plus de cela, Redis est vraiment flexible. Les structures de données sous-jacentes qu'il fournit sont les éléments constitutifs des systèmes de base de données hautes performances.

Quand utiliser Redis?

  • Mise en cache

    La mise en cache à l'aide de MongoDB n'a tout simplement pas beaucoup de sens. Ce serait trop lent.

  • Si vous avez suffisamment de temps pour réfléchir à votre conception de base de données.

    Vous ne pouvez pas simplement déposer vos documents dans Redis. Vous devez penser à la façon dont vous souhaitez stocker et organiser vos données. Un exemple est les hachages dans Redis. Ils sont très différents des objets imbriqués "traditionnels", ce qui signifie que vous devrez repenser la façon dont vous stockez les documents imbriqués. Une solution serait de stocker une référence à l'intérieur du hachage vers un autre hachage (quelque chose comme la clé: [id du deuxième hachage] ). Une autre idée serait de le stocker sous JSON, ce qui semble contre-intuitif pour la plupart des gens avec un arrière-plan * SQL.

  • Si vous avez besoin de très hautes performances.

    Il est presque impossible de battre les performances fournies par Redis. Imaginez que votre base de données soit aussi rapide que votre cache. C'est ce que l'on ressent en utilisant Redis comme une véritable base de données.

  • Si vous ne vous souciez pas que beaucoup au sujet de mise à l' échelle.

    Redimensionner Redis n'est plus aussi difficile qu'avant. Par exemple, vous pouvez utiliser une sorte de serveur proxy afin de distribuer les données entre plusieurs instances Redis. La réplication maître-esclave n'est pas si compliquée, mais la répartition de vos clés entre plusieurs instances Redis doit être effectuée sur le site d'application (par exemple en utilisant une fonction de hachage, Modulo, etc.). La mise à l'échelle de MongoDB par comparaison est beaucoup plus simple.

Quand utiliser MongoDB

  • Prototypage, Startups, Hackathons

    MongoDB est parfaitement adapté au prototypage rapide. Néanmoins, les performances ne sont pas si bonnes. Gardez également à l'esprit que vous devrez très probablement définir une sorte de schéma dans votre application.

  • Lorsque vous devez modifier rapidement votre schéma.

    Parce qu'il n'y a pas de schéma! La modification de tables dans un SGBD relationnel traditionnel est douloureusement coûteuse et lente. MongoDB résout ce problème en ne faisant pas beaucoup d'hypothèses sur vos données sous-jacentes. Néanmoins, il essaie d'optimiser autant que possible sans vous obliger à définir un schéma.

TL; DR - Utilisez Redis si les performances sont importantes et que vous êtes prêt à passer du temps à optimiser et à organiser vos données. - Utilisez MongoDB si vous avez besoin de construire un prototype sans trop vous soucier de votre base de données.

Lectures complémentaires:

Alexander Gugel
la source
3
Si vous avez suffisamment de temps pour réfléchir à votre conception de base de données. Pour le réaliser: supposons que vous souhaitiez stocker des données SO. Dans Mongo : videz simplement les questions complètes avec des réponses imbriquées et des commentaires, mais dans redis vous devez faire ce qui suit: SO sur redis
Abhishek Gupta
223

Redis. Disons que vous avez écrit un site en php; pour une raison quelconque, il devient populaire et il est en avance sur son temps ou a du porno dessus. Vous vous rendez compte que ce php est tellement lent, "Je vais perdre mes fans parce qu'ils n'attendront tout simplement pas 10 secondes pour une page." Vous vous rendez soudain compte qu'une page Web a une URL constante (elle ne change jamais, whoa), une clé primaire si vous voulez, puis vous vous souvenez que la mémoire est rapide tandis que le disque est lent et php est encore plus lent. :( Ensuite, vous créez un mécanisme de stockage utilisant la mémoire et cette URL que vous appelez une "clé" tandis que le contenu de la page Web que vous décidez d'appeler la "valeur". C'est tout ce que vous avez - clé et contenu. Vous l'appelez "meme cache". Vous aimez Richard Dawkins parce qu'il est génial. Vous cachez votre html comme les écureuils cachent leurs noix. Vous n'avez pas besoin de réécrire votre code php merde. Tu es heureux. Ensuite, vous voyez que d'autres l'ont fait - mais vous choisissez Redis parce que l'autre a des images confuses de chats, certains avec des crocs.

Mongo. Vous avez écrit un site. Heck vous en avez écrit beaucoup, et dans n'importe quelle langue. Vous vous rendez compte qu'une grande partie de votre temps est consacrée à l'écriture de ces clauses SQL puantes. Vous n'êtes pas un dba, pourtant vous y êtes, écrivant des instructions SQL stupides ... pas seulement une, mais flippant partout. msgstr "sélectionnez ceci, sélectionnez cela". Mais vous vous souvenez en particulier de la clause WHERE irritante. Où le nom de famille est égal à "Thornton" et le film est égal à "Bad Santa". Urgh. Vous pensez, "pourquoi ces dbas ne font-ils pas simplement leur travail et me donnent-ils des procédures stockées?" Ensuite, vous oubliez un champ mineur comme middlename, puis vous devez supprimer la table, exporter tous les 10G de données volumineuses et en créer un autre avec ce nouveau champ, et importer les données - et cela se répétera 10 fois au cours des 14 prochains jours pendant que vous continuez à vous souvenir des conneries comme la salutation, le titre, plus l'ajout d'une clé étrangère avec des adresses. Ensuite, vous pensez que le nom de famille doit être lastName. Près d'un changement par jour. Ensuite, vous dites sacrément. Je dois monter et écrire un site / système web, peu importe ce modèle de données bs. Donc, vous google, "Je déteste écrire SQL, s'il vous plaît pas de SQL, arrêtez", mais apparaît "nosql" et ensuite vous lisez des trucs et il dit qu'il vide simplement les données sans aucun schéma. Vous vous souvenez du fiasco de la semaine dernière, laissant tomber plus de tables et souriant. Ensuite, vous choisissez mongo parce que certains gros gars comme 'airbud' le site de location d'apt l'utilisent. Doux. Plus de changements de modèle de données car vous avez un modèle que vous continuez à changer.

Gabe Rainbow
la source
qu'entendez-vous par You don't need to rewrite your crap php code?, comment le magasin kv résout-il cela? :)
Roy Lee
13
@Roylee, il signifie que le php lent et merdique génère une page Web en html. Au lieu de réécrire laborieusement le code pour le rendre plus rapide / plus efficace, vous exécutez le php une fois au début puis pour toujours après, rappelez simplement la page Web pré-construite en html en utilisant votre magasin kv.
Mikepote
La façon dont vous avez raconté cette histoire m'a finalement aidé à conceptualiser pourquoi le sans schéma est génial! Cela m'a sauvé quelques années d'avoir à gérer SQL pour comprendre le pouvoir.
Nick Pineda
4
«Plus de changements de modèle» ne rend pas vraiment compte de la situation. À moins que vous n'écriviez du code de mouvement de données pour mettre à jour toutes vos entrées existantes, cela ressemble plus à des modèles 'N' légèrement différents vivant tous dans la même base de données en même temps, et votre code doit déterminer avec quel modèle il s'agit quand il lit quelque chose de la base de données.
Terry Coatta
2
L'une des meilleures réponses absolues que j'aie jamais vues. Il a un excellent contenu et me fait vraiment rire (littéralement pas lol)
colbyJax
16

Peut-être que cette ressource est utile pour décider entre les deux. Il aborde également plusieurs autres bases de données NoSQL et propose une courte liste de caractéristiques, ainsi qu'une explication «à quoi je l'utilise» pour chacune d'entre elles.

http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

stackex
la source
11

Question difficile à répondre - comme pour la plupart des solutions technologiques, cela dépend vraiment de votre situation et puisque vous n'avez pas décrit le problème que vous essayez de résoudre, comment peut-on proposer une solution?

Vous devez les tester tous les deux pour voir lequel d'entre eux répond à vos besoins.

Cela dit, MongoDB ne nécessite aucun matériel coûteux. Comme toute autre solution de base de données, elle fonctionnera mieux avec plus de CPU et de mémoire mais n'est certainement pas une exigence - en particulier pour les premiers développements.

Bryan Migliorisi
la source
10

Redis est un magasin de données en mémoire , qui peut conserver son état sur le disque (pour permettre la récupération après redémarrage). Cependant, être un magasin de données en mémoire signifie que la taille du magasin de données (sur un seul nœud) ne peut pas dépasser l'espace mémoire total sur le système (RAM physique + espace de swap). En réalité, ce sera beaucoup moins que cela, car Redis partage cet espace avec de nombreux autres processus sur le système, et s'il épuise l'espace mémoire du système, il sera probablement tué par le système d'exploitation.

Mongo est un magasin de données sur disque , qui est plus efficace lorsque son ensemble de travail tient dans la RAM physique (comme tous les logiciels). Être des données basées sur un disque signifie qu'il n'y a pas de limites intrinsèques à la taille d'une base de données Mongo, mais les options de configuration, l'espace disque disponible et d'autres préoccupations peuvent signifier que la taille des bases de données au-dessus d'une certaine limite peut devenir impraticable ou inefficace.

Redis et Mongo peuvent être mis en cluster pour une haute disponibilité, une sauvegarde et pour augmenter la taille globale de la banque de données.

aaa90210
la source
10

Toutes les réponses (au moment d'écrire ces lignes) supposent que Redis, MongoDB et peut-être une base de données relationnelle basée sur SQL sont essentiellement le même outil: "stocker des données". Ils ne considèrent pas du tout les modèles de données.

MongoDB: données complexes

MongoDB est un magasin de documents. Pour comparer avec une base de données relationnelle basée sur SQL: les bases de données relationnelles se simplifient en fichiers CSV indexés, chaque fichier étant une table; les magasins de documents se simplifient en fichiers JSON indexés, chaque fichier étant un document, plusieurs fichiers étant regroupés.

Les fichiers JSON sont similaires dans leur structure aux fichiers XML et YAML et aux dictionnaires comme en Python, alors pensez à vos données dans ce type de hiérarchie. Lors de l'indexation, la structure est la clé: un document contient des clés nommées, qui contiennent soit d'autres documents, des tableaux ou des valeurs scalaires. Considérez le document ci-dessous.

{
  _id:  0x194f38dc491a,
  Name:  "John Smith",
  PhoneNumber:
    Home: "555 999-1234",
    Work: "555 999-9876",
    Mobile: "555 634-5789"
  Accounts:
    - "379-1111"
    - "379-2574"
    - "414-6731"
}

Le document ci-dessus a une clé PhoneNumber.Mobile, qui a une valeur 555 634-5789. Vous pouvez rechercher dans une collection de documents où la clé,, PhoneNumber.Mobilea une certaine valeur; ils sont indexés.

Il a également un tableau Accountsqui contient plusieurs index. Il est possible d'interroger un document Accountscontenant exactement un sous-ensemble de valeurs, tous certains sous-ensembles de valeurs ou l'un quelconque des sous-ensembles de valeurs. Cela signifie que vous pouvez rechercher Accounts = ["379-1111", "379-2574"]et ne pas trouver ce qui précède; vous pouvez rechercher Accounts includes ["379-1111"]et trouver le document ci-dessus; et vous pouvez rechercher Accounts includes any of ["974-3785","414-6731"]et trouver ce qui précède et tout document comprenant le compte "974-3785", le cas échéant.

Les documents vont aussi loin que vous le souhaitez. PhoneNumber.Mobilepourrait contenir un tableau, ou même un sous-document ( PhoneNumber.Mobile.Worket PhoneNumber.Mobile.Personal). Si vos données sont très structurées, les documents constituent une avancée importante par rapport aux bases de données relationnelles.

Si vos données sont principalement plates, relationnelles et structurées de manière rigide, vous feriez mieux avec une base de données relationnelle. Encore une fois, le grand signe est de savoir si vos modèles de données conviennent le mieux à une collection de fichiers CSV interdépendants ou à une collection de fichiers XML / JSON / YAML.

Pour la plupart des projets, vous devrez faire des compromis, en acceptant une solution de contournement mineure dans certaines petites zones où SQL ou les magasins de documents ne correspondent pas; pour certains grands projets complexes stockant une large diffusion de données (de nombreuses colonnes; les lignes ne sont pas pertinentes), il sera judicieux de stocker certaines données dans un modèle et d'autres données dans un autre modèle. Facebook utilise à la fois SQL et une base de données graphique (où les données sont placées dans les nœuds et les nœuds sont connectés à d'autres nœuds); Craigslist utilisait auparavant MySQL et MongoDB, mais cherchait à passer entièrement sur MongoDB. Ce sont des endroits où l'étendue et la relation des données sont confrontées à des handicaps importants si elles sont regroupées sous un même modèle.

Redis: valeur-clé

Redis est, fondamentalement, un magasin de valeurs-clés. Redis vous permet de lui donner une clé et de rechercher une seule valeur. Redis lui-même peut stocker des chaînes, des listes, des hachages et quelques autres choses; cependant, il ne recherche que par son nom.

L'invalidation du cache est l'un des problèmes difficiles de l'informatique; l'autre nomme des choses. Cela signifie que vous utiliserez Redis lorsque vous souhaitez éviter des centaines de recherches excessives sur un back-end, mais vous devrez déterminer quand vous avez besoin d'une nouvelle recherche.

Le cas d'invalidation le plus évident est la mise à jour à l'écriture: si vous lisez user:Simon:lingots = NOTFOUND, vous pouvez SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simonet stocker le résultat 100, comme SET user:Simon:lingots = 100. Ensuite , lorsque vous accordez Simon 5 Lingots, vous avez bien lu user:Simon:lingots = 100, SET user:Simon:lingots = 105et UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon. Vous en avez maintenant 105 dans votre base de données et dans Redis, et vous pouvez obtenir user:Simon:lingotssans interroger la base de données.

Le deuxième cas est la mise à jour des informations dépendantes. Disons que vous générez des morceaux d'une page et mettez en cache leur sortie. L'en-tête montre l'expérience, le niveau et le montant d'argent du joueur; la page de profil du joueur a un bloc qui montre leurs statistiques; et ainsi de suite. Le joueur gagne de l'expérience. Eh bien, maintenant vous avez plusieurs templates:Header:Simon, templates:StatsBox:Simon, templates:GrowthGraph:Simonet ainsi de champs de suite où vous avez mis en cache la sortie d'une base de données des requêtes demi-douzaine passent par un moteur de template. Normalement, lorsque vous affichez ces pages, vous dites:

$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
  $t = BuildTemplate("StatsBox.tmpl",
                     GetStatsFromDatabase($playerName));
  SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;

Étant donné que vous venez de mettre à jour les résultats de GetStatsFromDatabase("Simon"), vous devez abandonner templates:*:Simonvotre cache de valeurs-clés. Lorsque vous essayez de rendre l'un de ces modèles, votre application supprimera la récupération des données de votre base de données (PostgreSQL, MongoDB) et l'insérera dans votre modèle; il stockera ensuite le résultat dans Redis et, espérons-le, ne prendra pas la peine de faire des requêtes de base de données et des modèles de rendu la prochaine fois qu'il affichera ce bloc de sortie.

Redis vous permet également de faire des files d'attente de messages d'abonnement à l'éditeur et autres. C'est un tout autre sujet. Le point ici est que Redis est un cache de valeurs-clés, qui diffère d'une base de données relationnelle ou d'un magasin de documents.

Conclusion

Choisissez vos outils en fonction de vos besoins. Le plus grand besoin est généralement un modèle de données, car cela détermine la complexité et le risque d'erreur de votre code. Les applications spécialisées s'appuieront sur les performances, des endroits où vous écrivez tout dans un mélange de C et d'assemblage; la plupart des applications se contentent de gérer le cas généralisé et utilisent un système de mise en cache tel que Redis ou Memcached, qui est beaucoup plus rapide qu'une base de données SQL hautes performances ou un magasin de documents.

John Moser
la source
2
"L'invalidation du cache est l'un des problèmes difficiles de l'informatique; l'autre est de nommer les choses." Tellement vrai!
Arel
2

Et vous ne devez utiliser ni l'un ni l'autre si vous avez beaucoup de RAM. Redis et MongoDB arrivent au prix d'un outil à usage général. Cela introduit beaucoup de frais généraux.

On disait que Redis est 10 fois plus rapide que Mongo. Ce n'est peut-être plus vrai. MongoDB (si je me souviens bien) prétendait battre memcache pour le stockage et la mise en cache des documents tant que les configurations de mémoire sont les mêmes.

De toute façon. Redis bon, MongoDB est bon. Si vous vous souciez des sous-structures et avez besoin d'agrégation, optez pour MongoDB. Si le stockage des clés et des valeurs est votre principale préoccupation, il s'agit de Redis. (ou tout autre magasin de valeurs clés).

Martin Kersten
la source
2

Redis et MongoDB sont tous deux des bases de données non relationnelles mais elles sont de catégories différentes.

Redis est une base de données de clés / valeurs et utilise le stockage en mémoire, ce qui le rend très rapide. C'est un bon candidat pour la mise en cache de trucs et le stockage de données temporaires (en mémoire) et comme la plupart des plates-formes cloud (comme Azure, AWS) le prennent en charge, son utilisation de la mémoire est évolutive.Mais si vous allez l'utiliser sur vos machines avec ressources limitées, considérez que c'est l'utilisation de la mémoire.

MongoDB, d'autre part, est une base de données de documents. C'est une bonne option pour conserver de gros textes, images, vidéos, etc. et presque tout ce que vous faites avec des bases de données, sauf les transactions.Par exemple, si vous voulez développer un blog ou un réseau social, MongoDB est un bon choix. Il est évolutif avec une stratégie de mise à l'échelle. Il utilise le disque comme support de stockage, de sorte que les données seront conservées.

akazemis
la source
1

Si votre projet bouge vous permet d'avoir suffisamment de mémoire RAM sur votre environnement - la réponse est Redis. Surtout en tenant compte du nouveau Redis 3.2 avec fonctionnalité cluster.

Denys
la source