web-dev-qa-db-fra.com

Redis est-il juste une cache?

J'ai lu des docs Redis et essayé le tutoriel à l'adresse http://try.redis-db.com/ . Jusqu'à présent, je ne vois aucune différence entre Redis et les technologies de mise en cache, telles que Velocity ou l'Enterprise Caching Framework.

En réalité, vous ne faites qu'ajouter 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?

227
Matthew Evans

Non, Redis est beaucoup plus qu'une cache. 

Comme un cache, Redis stocke des paires clé = valeur. Mais contrairement à un cache, Redis vous permet d’exploiter les valeurs. Il existe 5 types de données dans Redis - Chaînes, Ensembles, Hash, Listes et Ensembles triés. Chaque type de données expose diverses opérations.

La meilleure façon de comprendre Redis consiste à modéliser une application sans penser à la manière 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, balises et utilisateurs.

Questions de modélisation, utilisateurs et réponses

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

Chacun de ces objets peut être directement stocké dans Redis sous forme de hachage. Pour générer des identifiants uniques, vous pouvez utiliser la commande atomic increment. 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

Traitement des votes

Maintenant, chaque fois que quelqu'un upvote 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 de 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 également le meilleur moyen 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

Désormais, 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 traitement en pipeline et affichez-les à l'utilisateur.

Questions par mots-clés, triées par votes

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

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

Faisons-le pour le tag 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 obtiendra un vote positif, nous augmenterons son score. Et quand un utilisateur clique sur "Questions marquées Redis, triées par votes", nous faisons simplement une zrevrange et répondons aux questions les plus fréquentes.

Questions en temps réel sans page rafraîchissante

Et enfin, un bonus. Si vous laissez la page de questions ouverte, SO vous avertira de l’ajout d’une nouvelle question. Comment Redis peut aider ici?

Redis a un modèle de pub-sous. Vous pouvez créer des canaux, par exemple "channel_questions_tagged_redis". Vous avez alors subscribe utilisateurs sur un canal particulier. Quand une nouvelle question est ajoutée, vous devriez publish un 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 pour toute la tuyauterie 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 améliorer la fiabilité. Pour en savoir plus, consultez les rubriques Persistence et Réplication ici - http://redis.io/documentation

586
Sripathi Krishnan

Redis possède des capacités uniques telles que les scripts lua ultra-rapides. Son temps d'exécution est égal à l'exécution des commandes C. Cela apporte également de l’atomicité à la manipulation sophistiquée des données Redis, nécessaire au travail de nombreux objets avancés comme les verrous et les sémaphores.

Il existe une grille de données en mémoire Redis appelée Redisson qui permet de construire facilement une application distribuée sur Java. Merci aux objets distribués Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMap et bien d’autres.

Fonctionne parfaitement dans le cloud et prend en charge AWS Elasticache , Cluster AWS Elasticache et Cache Azure Redis support

3
Nikita Koksharov

Pas seulement une cache.

  • En mémoire clé-valeur de stockage
  • Prend en charge plusieurs types de données (chaînes, hachages, listes, ensembles, ensembles triés, images bitmap et hyperloglogs)
  • Il offre la possibilité de stocker des données de cache dans un stockage physique (si nécessaire).
  • Soutien pub-sous modèle
  • Le cache Redis assure la réplication pour la haute disponibilité (maître/esclave)
2
Pankaj Rawat

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

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

Nous l'utilisons en production. Redis nous aide à concevoir un logiciel capable de gérer des milliers de demandes par seconde et de conserver les données commerciales des clients tout au long de leur cycle de vie.

1
Denys

Redis est le cache le mieux adapté à l’architecture distribuée/Microservice.

Il est rapide, fiable, assure l’unicité et la cohérence et propose une gamme de types de données tels que des ensembles, des hachages, des listes, etc. 

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

0
Manvendra Jina

En plus d'être un serveur de cache, Redis est spécifiquement un serveur de structure de données. Etre un cache sous la forme d'un serveur de structure de données est très important, car les structures de données sont les bases des programmes, ou des applications . Considérez que vous utilisez des bases de données SQL comme technologie de stockage et que vous devez créer une liste, une carte de hachage, un ensemble de classement ou des éléments du même genre, c’est un peu pénible. Redis peut vous fournir ces fonctionnalités directement de manière très simple, simplifiant ainsi grandement le développement.

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

0