Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis n'est-il qu'un cache ?

Non, Redis est bien plus qu'un cache.

Comme un cache, Redis stocke les 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 :chaînes, ensembles, hachage, listes et ensembles triés. 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 faire simple, nous avons besoin de Questions, Réponses, Balises 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 des champs {id, title, 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 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 pour 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 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

Désormais, lorsque vous souhaitez 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 à l'aide du pipelining et montrez-les à l'utilisateur.

Questions par tags, triées par votes

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

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

Allons-y et faisons ceci 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'est-ce qu'on a 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 taguées Redis, triées par votes", nous faisons juste un zrevrange et récupérez les principales questions.

Questions en temps réel sans rafraîchir la page

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 vous aider ?

Redis a un modèle pub-sub. Vous pouvez créer des canaux, par exemple "channel_questions_tagged_redis". Vous subscribe utilisateurs à un canal particulier. Lorsqu'une nouvelle question est ajoutée, vous devez publish un message à ce canal. Tous les utilisateurs recevraient alors le message. Vous devrez utiliser une technologie Web comme les sockets Web ou la 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 offrir une meilleure fiabilité. Pour en savoir plus, consultez les rubriques sur la persistance et la réplication ici - http://redis.io/documentation