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
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é ?