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 zrevrange
et 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 subscribe
utilisateurs d'un canal particulier. Lorsqu'une nouvelle question est ajoutée, vous enverriez 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 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