273 votes

Redis est-il seulement un cache ?

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

En fait, vous ne faites qu'ajouter des objets à un magasin de données en mémoire en utilisant une clé unique. Il ne semble pas y avoir de sémantique relationnelle...

Qu'est-ce que je rate ?

3 votes

De redis.io : Redis est un magasin de clés-valeurs avancé et open source. On l'appelle souvent un serveur de structures de données puisque les clés peuvent contenir des chaînes de caractères, 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.

30 votes

Je suis d'accord, ce n'est pas le format SO. Où pensez-vous qu'il serait plus approprié ?

659voto

Sripathi Krishnan Points 15402

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 y a 5 types de données dans Redis - Strings, Sets, Hash, Lists et Sorted Sets. Chaque type de données expose diverses 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, Balises et Utilisateurs.

Questions, utilisateurs et réponses sur la modélisation

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

Chacun de ces objets peut être directement stocké dans Redis comme un Hash. Pour générer des ids uniques, vous pouvez utiliser la commande atomique d'incrémentation. Quelque chose comme ceci -

$ 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 positifs

Maintenant, chaque fois que quelqu'un upvote une question ou une réponse, vous devez simplement faire ceci

$ 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 pour les 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 la meilleure façon de stocker cela dans Redis également.

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, quand vous voulez rendre votre page d'accueil, vous demandez à Redis les 25 questions les plus récentes.

$ 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 en utilisant le pipelining et montrez-les à l'utilisateur.

Questions par étiquettes, triées par votes

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

Pour modéliser cela, nous utilisons la fonction Sorted Set de Redis. Un Sorted Set vous permet d'associer un score à chaque élément. Vous pouvez ensuite récupérer les éléments en fonction de leur score.

Faisons cela 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'est-ce qu'on a fait ici ? Nous avons ajouté des questions à un ensemble trié, et nous avons associé un score (nombre de votes) à chaque question. Chaque fois qu'une question reçoit un vote positif, nous incrémentons son score. Et quand un utilisateur clique sur "Questions tagged Redis, sorted by votes", nous faisons juste un zrevrange et récupérer les meilleures questions.

Questions en temps réel sans rafraîchissement de la page

Et enfin, un 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 canaux, par exemple "canal_questions_tagged_redis". Vous pouvez ensuite subscribe les utilisateurs à un canal particulier. Lorsqu'une nouvelle question est ajoutée, vous publish un message à ce canal. Tous les utilisateurs recevront alors le message. Vous devrez utiliser une technologie web comme les web sockets ou comet pour délivrer réellement le message au navigateur, mais Redis vous aide avec toute la plomberie du côté serveur.

Persistance, fiabilité, etc.

Contrairement à un Cache, Redis persiste 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 sujets relatifs à la persistance et à la réplication ici - http://redis.io/documentation

16 votes

Il s'agit également d'un bus de service extrêmement simple utilisant les commandes PUB/SUB.

3 votes

Comment puis-je récupérer les questions par utilisateur ? Dois-je créer une liste pour chaque utilisateur avec vos questions, comme questions:user:1 ou dois-je utiliser les tags ?

3 votes

Explication très utile et détaillée que je n'ai jamais vue sur SO

5voto

Pankaj Rawat Points 497

Pas seulement un cache.

  • Stockage clé-valeur en mémoire
  • Prise en charge de plusieurs types de données (chaînes, hachages, listes, ensembles, ensembles triés, bitmaps et hyperlogiciels)
  • Il offre la possibilité de stocker les données du cache dans un stockage physique (si nécessaire).
  • Soutenir le modèle pub-sub
  • Le cache Redis assure la réplication pour la haute disponibilité (maître/esclave).

4voto

Nikita Koksharov Points 1552

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

Il existe une grille de données en mémoire basée sur Redis, appelée Redisson qui permet de construire facilement application distribuée sur Java . Grâce à la distribution Lock , Semaphore , ReadWriteLock , CountDownLatch , ConcurrentMap objets et bien d'autres encore.

Fonctionne parfaitement dans le nuage et supporte AWS Elasticache , Cluster AWS Elasticache et Cache Azure Redis soutien

1voto

Denys Points 424

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 la base de données (cache, persistance permanente, etc.).

Redis est bon pour le cache, c'est vrai, mais c'est bien plus qu'un simple cache. C'est une base de données haute vitesse entièrement en mémoire. Il fait persister 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 à construire des logiciels qui traitent des milliers de demandes par seconde et à conserver les données commerciales des clients pendant tout le cycle de vie naturel.

1voto

vijay Points 41

Redis supporte les structures de données telles que les chaînes de caractères, les hachages, les listes, les ensembles, les ensembles triés avec des requêtes de plage, les bitmaps, les hyperlogs, les index géospatiaux avec des requêtes de rayon et les flux. Redis intègre la réplication, les scripts Lua, l'éviction LRU, les transactions et différents niveaux de persistance sur disque, et offre une haute disponibilité via Redis Sentinel et un partitionnement automatique avec Redis Cluster.

mise en œuvre avec python

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X