sql >> Databasteknik >  >> NoSQL >> Redis

Är Redis bara en cache?

Nej, Redis är mycket mer än en cache.

Som en cache lagrar Redis nyckel=värdepar. Men till skillnad från en cache låter Redis dig arbeta på värdena. Det finns 5 datatyper i Redis - strängar, uppsättningar, hash, listor och sorterade uppsättningar. Varje datatyp avslöjar olika operationer.

Det bästa sättet att förstå Redis är att modellera en applikation utan att tänka på hur du ska lagra den i en databas.

Låt oss säga att vi vill bygga StackOverflow.com. För att göra det enkelt behöver vi frågor, svar, taggar och användare.

Modelleringsfrågor, användare och svar

Varje objekt kan modelleras som en karta. Till exempel är en fråga en karta med fälten {id, title, date_asked, votes, ask_by, status}. På samma sätt är ett svar en karta med fälten {id, question_id, answer_text, answered_by, votes, status}. På liknande sätt kan vi modellera ett användarobjekt.

Vart och ett av dessa objekt kan lagras direkt i Redis som en Hash. För att generera unika ID kan du använda kommandot atomic increment. Något sånt här -

$ 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

Hantera röster

Nu, varje gång någon röstar upp en fråga eller ett svar, behöver du bara göra detta

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

Frågelista för hemsidan

Därefter vill vi lagra de senaste frågorna för att visa på hemsidan. Om du skrev ett .NET- eller Java-program skulle du lagra frågorna i en lista. Det visar sig att det är det bästa sättet att lagra detta i Redis också.

Varje gång någon ställer en fråga lägger vi till dess id i listan.

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

Nu, när du vill rendera din hemsida, frågar du Redis om de senaste 25 frågorna.

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

Nu när du har ID:n, hämta objekt från Redis med pipelining och visa dem för användaren.

Frågor efter taggar, sorterade efter röster

Därefter vill vi hämta frågor för varje tagg. Men SO låter dig se de mest röstade frågorna, nya frågor eller obesvarade frågor under varje tagg.

För att modellera detta använder vi Redis sorterade uppsättningsfunktion. En sorterad uppsättning låter dig associera en poäng till varje element. Du kan sedan hämta element baserat på deras poäng.

Låt oss gå vidare och göra detta för Redis-taggen

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

Vad gjorde vi här? Vi lade till frågor till en sorterad uppsättning och kopplade en poäng (antal röster) till varje fråga. Varje gång en fråga röstas upp kommer vi att öka dess poäng. Och när en användare klickar på "Frågor taggade Redis, sorterade efter röster", gör vi bara en zrevrange och få tillbaka de vanligaste frågorna.

Frågor i realtid utan att uppdatera sidan

Och slutligen en bonusfunktion. Om du håller frågesidan öppen kommer SO att meddela dig när en ny fråga läggs till. Hur kan Redis hjälpa till här?

Redis har en pub-sub-modell. Du kan skapa kanaler, till exempel "channel_questions_tagged_redis". Du subscribe användare till en viss kanal. När en ny fråga läggs till skulle du publish ett meddelande till den kanalen. Alla användare skulle då få meddelandet. Du måste använda en webbteknik som webbsockets eller komet för att faktiskt leverera meddelandet till webbläsaren, men Redis hjälper dig med allt rörarbete på serversidan.

Peristens, Pålitlighet etc.

Till skillnad från en cache kvarstår Redis data på hårddisken. Du kan ha en master-slave-inställning för att ge bättre tillförlitlighet. För att lära dig mer, gå igenom persistens och replikeringsämnen här - http://redis.io/documentation



  1. Hur kan jag lösenordsskydda min /sidekiq-rutt (dvs. kräver autentisering för Sidekiq::Web-verktyget)?

  2. Hur man formaterar datumet i MongoDB

  3. Spring Data Redis Expire Key

  4. Steg för att installera MongoDB på Amazon Linux