Redis n'est-il qu'un cache?

255

J'ai lu quelques documents Redis et essayé le didacticiel sur http://try.redis-db.com/ . Jusqu'à présent, je ne vois aucune différence entre Redis et les technologies de mise en cache comme Velocity ou Enterprise Library Caching Framework

En fait, vous ajoutez simplement des objets à un magasin de données en mémoire à l'aide d'une clé unique. Il ne semble pas y avoir de sémantique relationnelle ...

Qu'est-ce que je rate?

Matt Evans
la source
3
De redis.io : Redis est un magasin de valeurs-clés avancé et open source. Il est souvent appelé serveur de structure de données car les clés peuvent contenir des chaînes, des hachages, des listes, des ensembles et des ensembles triés. Cela dit, j'ai voté pour fermer votre question car elle ne correspond pas au format de StackOverflow.
Linus Thiel
29
J'accepte son format non SO. Où pensez-vous que ce serait plus approprié?
Matt Evans

Réponses:

631

Non, Redis est bien plus qu'un cache.

Comme un cache, Redis stocke des paires clé = valeur. Mais contrairement à un cache, Redis vous permet d'opérer sur les valeurs. Il existe 5 types de données dans Redis - Strings, Sets, Hash, Lists et Sorted Sets. Chaque type de données expose différentes opérations.

La meilleure façon de comprendre Redis est de modéliser une application sans penser à la façon dont vous allez la stocker dans une base de données.

Disons que nous voulons construire StackOverflow.com. Pour rester simple, nous avons besoin de Questions, Réponses, Tags et Utilisateurs.

Modélisation des questions, des utilisateurs et des réponses

Chaque objet peut être modélisé comme une carte. Par exemple, une Question est une carte avec les champs {id, title, date_asked, votes, ask_by, status}. De même, une réponse est une carte avec les champs {id, question_id, answer_text, respond_by, votes, status}. De même, nous pouvons modéliser un objet utilisateur.

Chacun de ces objets peut être directement stocké dans Redis en tant que hachage. Pour générer des identifiants uniques, vous pouvez utiliser la commande d'incrémentation atomique. Quelque chose comme ça -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Gérer les votes

Maintenant, chaque fois que quelqu'un vote une question ou une réponse, il vous suffit de le faire

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Liste des questions pour la page d'accueil

Ensuite, nous voulons stocker les questions les plus récentes à afficher sur la page d'accueil. Si vous écriviez un programme .NET ou Java, vous stockeriez les questions dans une liste. Il s'avère que c'est aussi la meilleure façon de stocker cela dans Redis.

Chaque fois que quelqu'un pose une question, nous ajoutons son identifiant à la liste.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Maintenant, lorsque vous souhaitez afficher votre page d'accueil, vous demandez à Redis les 25 dernières questions.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Maintenant que vous avez les identifiants, récupérez les éléments de Redis à l'aide du pipelining et montrez-les à l'utilisateur.

Questions par balises, triées par votes

Ensuite, nous voulons récupérer des questions pour chaque balise. Mais SO vous permet de voir les questions les mieux votées, les nouvelles questions ou les questions sans réponse sous chaque balise.

Pour modéliser cela, nous utilisons la fonction de jeu trié de Redis. Un ensemble trié vous permet d'associer une partition à chaque élément. Vous pouvez ensuite récupérer des éléments en fonction de leurs scores.

Allons de l'avant et faisons cela pour la balise Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Qu'avons-nous fait ici? Nous avons ajouté des questions à un ensemble trié et associé un score (nombre de votes) à chaque question. Chaque fois qu'une question est votée, nous augmenterons son score. Et lorsqu'un utilisateur clique sur "Questions étiquetées Redis, triées par votes", nous faisons simplement une zrevrangeet récupérons les principales questions.

Questions en temps réel sans page rafraîchissante

Et enfin, une fonction bonus. Si vous gardez la page des questions ouverte, SO vous avertira lorsqu'une nouvelle question sera ajoutée. Comment Redis peut-il aider ici?

Redis a un modèle pub-sub. Vous pouvez créer des chaînes, par exemple "channel_questions_tagged_redis". Vous puis les subscribeutilisateurs d'un canal particulier. Lorsqu'une nouvelle question est ajoutée, vous enverriez publishun message à ce canal. Tous les utilisateurs recevraient alors le message. Vous devrez utiliser une technologie Web telle que des sockets Web ou une comète pour transmettre le message au navigateur, mais Redis vous aide avec toute la plomberie côté serveur.

Persistance, fiabilité, etc.

Contrairement à un cache, Redis conserve les données sur le disque dur. Vous pouvez avoir une configuration maître-esclave pour fournir une meilleure fiabilité. Pour en savoir plus, consultez les rubriques Persistance et réplication ici - http://redis.io/documentation

Sripathi Krishnan
la source
15
Il s'agit également d'un bus de service extrêmement simple utilisant les commandes associées à PUB / SUB.
Jim Dennis
3
Comment récupérer une question par utilisateur? Dois-je créer une liste pour chaque utilisateur avec vos questions, comme des questions: utilisateur: 1 ou dois-je utiliser des balises?
Diogo Alves
2
explication très utile et détaillée que j'ai vue sur SO
Trong Vu
5

Pas seulement une cache.

  • Stockage de valeurs-clés en mémoire
  • Prend en charge plusieurs types de données (chaînes, hachages, listes, ensembles, ensembles triés, bitmaps et hyperloglogs)
  • Il offre la possibilité de stocker des données de cache dans un stockage physique (si nécessaire).
  • Supporte le modèle pub-sub
  • Le cache Redis fournit une réplication pour une haute disponibilité (maître / esclave)
Pankaj Rawat
la source
4

Redis a des capacités uniques comme des lua-scripts ultra-rapides. Son temps d'exécution est égal à l'exécution des commandes C. Cela apporte également une atomicité pour la manipulation de données Redis sophistiquée requise pour le travail de nombreux objets avancés comme les verrous et les sémaphores.

Il existe un Redis basé sur une grille de données en mémoire appelé Redisson qui permet de construire facilement des applications distribuées sur Java . Merci à distribués Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapobjets et bien d' autres.

Fonctionne parfaitement dans les nuages et soutient AWS ElastiCache , AWS ElastiCache Cluster et Azure Redis Cache support

Nikita Koksharov
la source
1

En fait, il n'y a aucune dépendance entre la représentation relative des données (ou tout autre type de représentation des données) et le rôle de base de données (cache, persistance permanente, etc.).

Redis est bon pour le cache, c'est vrai, mais c'est bien plus qu'un cache. C'est une base de données haute vitesse entièrement en mémoire. Il persiste des données sur le disque. Ce n'est pas relationnel, c'est un stockage de valeur-clé.

Nous l'utilisons en production. Redis nous aide à créer un logiciel qui gère des milliers de demandes par seconde et conserve les données commerciales des clients tout au long du cycle de vie naturel.

Denys
la source
0

Redis est un cache qui convient le mieux à un environnement distribué / à une architecture de microservices.

Il est rapide, fiable, offre atomicité et cohérence et a une gamme de types de données tels que des ensembles, des hachages, des listes, etc.

Je l'utilise depuis un an et il s'agit vraiment d'un sauveur lorsque vous devez fournir une solution prête à la production très rapidement et pour tout problème lié aux performances, car vous pouvez toujours l'utiliser pour mettre en cache les données.

Manvendra Jina
la source
0

En plus d'être un serveur de cache, Redis est spécifiquement un serveur de structure de données. Être un cache sous la forme d'un serveur de structure de données signifie beaucoup, car les structures de données sont les fondements des programmes ou des applications . Considérez que vous utilisez des bases de données SQL comme technologie de stockage et que vous devez construire une liste, une carte de hachage, un ensemble de classement ou des choses comme ça, c'est une sorte de douleur dans le cou. Redis peut vous fournir ces fonctionnalités directement de manière très simple, simplifiant ainsi fortement le développement.

D'un autre côté, un serveur de structure de données n'a pas besoin d'être sous forme de cache. Il existe des projets compatibles avec Redis mais qui ont des moteurs de stockage persistants.

不辞 长 做 岭南 人
la source
0

Redis prend en charge des structures de données telles que des chaînes, des hachages, des listes, des ensembles, des ensembles triés avec des requêtes de plage, des bitmaps, des hyperloglogs, des index géospatiaux avec des requêtes de rayon et des flux. Redis a une réplication intégrée, des scripts Lua, l'expulsion LRU, des transactions et différents niveaux de persistance sur disque, et offre une haute disponibilité via Redis Sentinel et un partitionnement automatique avec Redis Cluster.

implémentation avec python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

vijay
la source