sql >> Databasteknik >  >> NoSQL >> Redis

Vilka är de underliggande datastrukturerna som används för Redis?

Jag ska försöka svara på din fråga, men jag börjar med något som kan se konstigt ut till en början:om du inte är intresserad av Redis internals borde du inte bry dig om hur datatyper implementeras internt. Detta är av en enkel anledning:för varje Redis-operation hittar du tidskomplexiteten i dokumentationen och, om du har uppsättningen av operationer och tidskomplexiteten, är det enda andra du behöver en aning om minnesanvändning (och eftersom vi gör många optimeringar som kan variera beroende på data, det bästa sättet att få dessa senare siffror är att göra några triviala verkliga tester).

Men eftersom du frågade, här är den underliggande implementeringen av alla Redis-datatyper.

  • Strängar implementeras med hjälp av ett C dynamiskt strängbibliotek så att vi inte betalar (asymptotiskt sett) för allokering i append-operationer. På så sätt har vi till exempel O(N)-tillägg istället för att ha kvadratiskt beteende.
  • Listor implementeras med länkade listor.
  • Set och Hashar implementeras med hashtabeller.
  • Sorterade uppsättningar implementeras med överhoppningslistor (en speciell typ av balanserade träd).

Men när listor, uppsättningar och sorterade uppsättningar är små i antal objekt och storleken på de största värdena, används en annan, mycket mer kompakt kodning. Denna kodning skiljer sig åt för olika typer, men har funktionen att det är en kompakt dataklump som ofta tvingar fram en O(N)-skanning för varje operation. Eftersom vi endast använder det här formatet för små objekt är detta inget problem; att skanna en liten O(N)-klump är cacheminne så praktiskt sett är det väldigt snabbt, och när det finns för många element växlas kodningen automatiskt till den ursprungliga kodningen (länkad lista, hash och så vidare).

Men din fråga handlade egentligen inte bara om interna delar, din poäng var Vilken typ ska man använda för att åstadkomma vad? .

Strängar

Detta är bastypen av alla typer. Det är en av de fyra typerna men är också bastypen för de komplexa typerna, eftersom en lista är en lista med strängar, en uppsättning är en uppsättning strängar och så vidare.

En Redis-sträng är en bra idé i alla uppenbara scenarier där du vill lagra en HTML-sida, men också när du vill undvika att konvertera din redan kodade data. Så om du till exempel har JSON eller MessagePack kan du bara lagra objekt som strängar. I Redis 2.6 kan du till och med manipulera den här typen av objektserversida med hjälp av Lua-skript.

En annan intressant användning av strängar är bitmappar, och i allmänhet random access-arrayer av byte, eftersom Redis exporterar kommandon för att komma åt slumpmässiga intervall av byte, eller till och med enstaka bitar. Kolla till exempel detta bra blogginlägg:Snabb Enkel realtidsmätning med Redis.

Listor

Listor är bra när du sannolikt bara rör ytterligheterna av listan:nära svansen eller nära huvudet. Listor är inte särskilt bra för att paginera saker, eftersom slumpmässig åtkomst är långsam, O(N). Så bra användningsområden för listor är vanliga köer och stackar, eller bearbetning av objekt i en loop med RPOPLPUSH med samma källa och destination för att "rotera" en ring av föremål.

Listor är också bra när vi bara vill skapa en begränsad samling av N objekt där vanligtvis vi kommer bara åt de övre eller nedre objekten, eller när N är litet.

Set

Uppsättningar är en oordnad datainsamling, så de är bra varje gång du har en samling av föremål och det är mycket viktigt att kontrollera om samlingen finns eller storlek på ett mycket snabbt sätt. En annan häftig sak med set är stöd för att titta eller poppa slumpmässiga element (SRANDMEMBER och SPOP-kommandon).

Uppsättningar är också bra för att representera relationer, t.ex. "Vad är vänner till användare X?" och så vidare. Men andra bra datastrukturer för den här typen av saker är sorterade uppsättningar som vi kommer att se.

Uppsättningar stöder komplexa operationer som korsningar, fackföreningar och så vidare, så det här är en bra datastruktur för att använda Redis på ett "beräkningsmässigt" sätt, när du har data och du vill utföra transformationer på den datan för att få lite utdata.

Små uppsättningar kodas på ett mycket effektivt sätt.

Hashar

Hashes är den perfekta datastrukturen för att representera objekt, sammansatta av fält och värden. Fält med hash kan också ökas atomärt med HINCRBY. När du har objekt som användare, blogginlägg eller någon annan typ av objekt , hash är förmodligen rätt väg att gå om du inte vill använda din egen kodning som JSON eller liknande.

Kom dock ihåg att små hash kodas mycket effektivt av Redis, och du kan be Redis att atomiskt GET, SET eller öka individuella fält på ett mycket snabbt sätt.

Hashes kan också användas för att representera länkade datastrukturer med hjälp av referenser. Kontrollera till exempel lamernews.coms implementering av kommentarer.

Sorterade uppsättningar

Sorterade uppsättningar är de enda andra datastrukturerna, förutom listor, för att underhålla ordnade element . Du kan göra en rad coola saker med sorterade set. Du kan till exempel ha alla typer av Top Something listor i din webbapplikation. Toppanvändare efter poäng, toppinlägg efter sidvisningar, topp vad som helst, men en enda Redis-instans kommer att stödja massor av infogning och get-top-elements operationer per sekund.

Sorterade uppsättningar, som vanliga uppsättningar, kan användas för att beskriva relationer, men de låter dig också paginera listan med objekt och komma ihåg beställningen. Om jag till exempel minns vänner till användare X med en sorterad uppsättning kan jag lätt komma ihåg dem i ordning efter accepterad vänskap.

Sorterade uppsättningar är bra för prioriterade köer.

Sorterade uppsättningar är som mer kraftfulla listor där det alltid går snabbt att infoga, ta bort eller hämta intervall från mitten av listan. Men de använder mer minne och är O(log(N)) datastrukturer.

Slutsats

Jag hoppas att jag gav lite information i det här inlägget, men det är mycket bättre att ladda ner källkoden för lamernews från http://github.com/antirez/lamernews och förstå hur det fungerar. Många datastrukturer från Redis används inuti Lamer News, och det finns många ledtrådar om vad man ska använda för att lösa en given uppgift.

Ursäkta grammatiska stavfel, det är midnatt här och för trött för att granska inlägget;)



  1. CDH 6.2 Release:Vad är nytt i HBase

  2. Visa om listan över kapslade nycklar

  3. Hur hanterar MongoDB samtidiga uppdateringar?

  4. phpMyAdmin motsvarande MySQL för Redis?