sql >> Database >  >> NoSQL >> Redis

Is Redis slechts een cache?

Nee, Redis is veel meer dan een cache.

Net als een cache slaat Redis key=value-paren op. Maar in tegenstelling tot een cache, kunt u met Redis op de waarden werken. Er zijn 5 gegevenstypen in Redis - Strings, Sets, Hash, Lists en Sorted Sets. Elk gegevenstype onthult verschillende bewerkingen.

De beste manier om Redis te begrijpen, is door een toepassing te modelleren zonder na te denken over hoe u deze in een database gaat opslaan.

Laten we zeggen dat we StackOverflow.com willen bouwen. Om het simpel te houden, hebben we vragen, antwoorden, tags en gebruikers nodig.

Vragen, gebruikers en antwoorden modelleren

Elk object kan worden gemodelleerd als een kaart. Een vraag is bijvoorbeeld een kaart met velden {id, titel, date_asked, stemmen, gevraagd_by, status}. Evenzo is een antwoord een kaart met velden {id, vraag_id, antwoord_tekst, beantwoord_door, stemmen, status}. Op dezelfde manier kunnen we een gebruikersobject modelleren.

Elk van deze objecten kan direct in Redis worden opgeslagen als een hash. Om unieke id's te genereren, kunt u de opdracht atomic increment gebruiken. Zoiets -

$ 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

Stemmen verwerken

Nu, elke keer dat iemand een vraag of een antwoord omhoog stemt, hoef je dit alleen maar te doen

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Lijst met vragen voor startpagina

Vervolgens willen we de meest recente vragen opslaan om op de startpagina weer te geven. Als u een .NET- of Java-programma zou schrijven, zou u de vragen in een lijst opslaan. Blijkt dat dit ook de beste manier is om dit in Redis op te slaan.

Elke keer dat iemand een vraag stelt, voegen we zijn id toe aan de lijst.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Als u nu uw homepage wilt weergeven, stelt u Redis de meest recente 25 vragen.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Nu je de id's hebt, kun je items uit Redis ophalen met behulp van pipelining en ze aan de gebruiker laten zien.

Vragen op tags, gesorteerd op stemmen

Vervolgens willen we vragen ophalen voor elke tag. Maar met SO kun je de meest gestemde vragen, nieuwe vragen of onbeantwoorde vragen onder elke tag zien.

Om dit te modelleren, gebruiken we de functie Sorted Set van Redis. Met een gesorteerde set kunt u aan elk element een score koppelen. U kunt dan elementen ophalen op basis van hun scores.

Laten we doorgaan en dit doen voor de Redis-tag

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

Wat hebben we hier gedaan? We hebben vragen toegevoegd aan een gesorteerde set en aan elke vraag een score (aantal stemmen) gekoppeld. Elke keer dat een vraag omhoog wordt gestemd, verhogen we de score. En wanneer een gebruiker klikt op "Vragen getagd Redis, gesorteerd op stemmen", doen we gewoon een zrevrange en krijg de belangrijkste vragen terug.

Realtime vragen zonder pagina te vernieuwen

En tot slot een bonusfunctie. Als u de vragenpagina geopend houdt, zal SO u op de hoogte stellen wanneer een nieuwe vraag wordt toegevoegd. Hoe kan Redis hier helpen?

Redis heeft een pub-submodel. U kunt kanalen maken, bijvoorbeeld "channel_questions_tagged_redis". Vervolgens subscribe gebruikers naar een bepaald kanaal. Wanneer een nieuwe vraag wordt toegevoegd, zou je publish een bericht naar dat kanaal. Alle gebruikers zouden dan het bericht krijgen. U zult een webtechnologie zoals websockets of komeet moeten gebruiken om het bericht daadwerkelijk in de browser af te leveren, maar Redis helpt u met al het loodgieterswerk aan de serverzijde.

Persistentie, Betrouwbaarheid enz.

In tegenstelling tot een cache, bewaart Redis gegevens op de harde schijf. U kunt een master-slave-configuratie hebben voor een betere betrouwbaarheid. Ga voor meer informatie naar Persistence and Replication-onderwerpen hier - http://redis.io/documentation



  1. Verwijder duplicaat in MongoDB

  2. MongoDB - Gegevens exporteren

  3. groeperen op vragen over het verzamelen van meteoren

  4. Kunnen we meedoen aan Redis?