sql >> Database teknologi >  >> NoSQL >> Redis

Er Redis bare en cache?

Nej, Redis er meget mere end en cache.

Som en cache gemmer Redis nøgle=værdi-par. Men i modsætning til en cache lader Redis dig operere på værdierne. Der er 5 datatyper i Redis - strenge, sæt, hash, lister og sorterede sæt. Hver datatype afslører forskellige operationer.

Den bedste måde at forstå Redis på er at modellere en applikation uden at tænke på, hvordan du vil gemme den i en database.

Lad os sige, at vi vil bygge StackOverflow.com. For at holde det enkelt har vi brug for spørgsmål, svar, tags og brugere.

Modelleringsspørgsmål, brugere og svar

Hvert objekt kan modelleres som et kort. For eksempel er et spørgsmål et kort med felter {id, title, date_asked, votes, asked_by, status}. På samme måde er et svar et kort med felterne {id, question_id, answer_text, answered_by, votes, status}. På samme måde kan vi modellere et brugerobjekt.

Hvert af disse objekter kan gemmes direkte i Redis som en Hash. For at generere unikke id'er kan du bruge kommandoen atomic increment. Noget som dette -

$ 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

Håndtering af stemmer

Nu, hver gang nogen opretter et spørgsmål eller et svar, skal du bare gøre dette

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

Liste over spørgsmål til hjemmesiden

Dernæst vil vi gemme de seneste spørgsmål til visning på startsiden. Hvis du skrev et .NET- eller Java-program, ville du gemme spørgsmålene i en liste. Det viser sig, at det også er den bedste måde at opbevare dette på i Redis.

Hver gang nogen stiller et spørgsmål, tilføjer vi dets id til listen.

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

Når du nu vil gengive din hjemmeside, spørger du Redis om de seneste 25 spørgsmål.

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

Nu hvor du har id'erne, skal du hente elementer fra Redis ved hjælp af pipelining og vise dem til brugeren.

Spørgsmål efter tags, sorteret efter stemmer

Dernæst vil vi hente spørgsmål for hvert tag. Men SO giver dig mulighed for at se de mest stemte spørgsmål, nye spørgsmål eller ubesvarede spørgsmål under hvert tag.

For at modellere dette bruger vi Redis' Sorteret sæt-funktion. Et sorteret sæt giver dig mulighed for at knytte et partitur til hvert element. Du kan derefter hente elementer baseret på deres score.

Lad os gå videre og gøre dette for Redis-tagget

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

Hvad lavede vi her? Vi føjede spørgsmål til et sorteret sæt og tilknyttede en score (antal stemmer) til hvert spørgsmål. Hver gang et spørgsmål bliver opstemt, vil vi øge dets score. Og når en bruger klikker på "Spørgsmål tagget Redis, sorteret efter stemmer", laver vi bare en zrevrange og få de vigtigste spørgsmål tilbage.

Spørgsmål i realtid uden at opdatere siden

Og endelig en bonusfunktion. Hvis du holder spørgsmålssiden åben, vil SO give dig besked, når et nyt spørgsmål tilføjes. Hvordan kan Redis hjælpe her?

Redis har en pub-sub model. Du kan oprette kanaler, for eksempel "channel_questions_tagged_redis". Du subscribe brugere til en bestemt kanal. Når et nyt spørgsmål tilføjes, vil du publish en besked til den kanal. Alle brugere ville derefter få beskeden. Du bliver nødt til at bruge en webteknologi som web-sockets eller comet for rent faktisk at levere beskeden til browseren, men Redis hjælper dig med al VVS på serversiden.

Vedholdenhed, Pålidelighed osv.

I modsætning til en cache bevarer Redis data på harddisken. Du kan have en master-slave-opsætning for at give bedre pålidelighed. For at lære mere, gå gennem emnerne Persistens og replikering her - http://redis.io/documentation



  1. Atomicitet, isolation og samtidighed i MongoDB

  2. Reducer score i Redis eller fjern hvis 0

  3. Node.js og Mongoose regex-forespørgsel på flere felter

  4. Hvordan navnerumstaster på redis for at undgå navnekollisioner?