Varför Redis slår Memcached för cachning

Memcached eller Redis? Det är en fråga som nästan alltid uppstår i alla diskussioner om att pressa ut mer prestanda ur en modern, databasdriven webbapplikation. När prestanda måste förbättras är cachning ofta det första steget, och Memcached eller Redis är vanligtvis de första platserna att vända sig till.

Dessa kända cachemotorer delar ett antal likheter, men de har också viktiga skillnader. Redis, den nyare och mer mångsidiga av de två, är nästan alltid det överlägsna valet.

Redis vs Memcached för cachning

Låt oss börja med likheterna. Både Memcached och Redis fungerar som datalagrar i minnet, nyckelvärde, även om Redis beskrivs mer exakt som ett datastrukturlager. Både Memcached och Redis tillhör NoSQL-familjen med datahanteringslösningar, och båda är baserade på en nyckel-värdedatamodell. De håller båda all data i RAM, vilket naturligtvis gör dem extremt användbara som ett cachlager. När det gäller prestanda är de två datalagrarna också anmärkningsvärt lika och uppvisar nästan identiska egenskaper (och mätvärden) med avseende på genomströmning och latens.

Både Memcached och Redis är mogna och enormt populära open source-projekt. Memcached utvecklades ursprungligen av Brad Fitzpatrick 2003 för webbplatsen LiveJournal. Sedan dess har Memcached skrivits om i C (den ursprungliga implementeringen var i Perl) och placerades i det offentliga området, där det har blivit en hörnsten i moderna webbapplikationer. Den nuvarande utvecklingen av Memcached fokuserar på stabilitet och optimeringar snarare än att lägga till nya funktioner.

Redis skapades av Salvatore Sanfilippo 2009 och Sanfilippo är fortfarande den ledande utvecklaren av projektet idag. Redis beskrivs ibland som "Memcached on steroids", vilket knappast är förvånande med tanke på att delar av Redis byggdes som svar på lärdomarna från att använda Memcached. Redis har fler funktioner än Memcached och är därmed mer kraftfull och flexibel.

Används av många företag och i otaliga uppdragskritiska produktionsmiljöer, både Memcached och Redis stöds av klientbibliotek i alla tänkbara programmeringsspråk, och det ingår i en mängd paket för utvecklare. I själva verket är det en sällsynt webbstack som inte innehåller inbyggt stöd för varken Memcached eller Redis.

Varför är Memcached och Redis så populära? De är inte bara extremt effektiva, de är också relativt enkla. Att komma igång med antingen Memcached eller Redis anses vara ett enkelt arbete för en utvecklare. Det tar bara några minuter att ställa in och få dem att arbeta med en applikation. Således kan en liten investering av tid och ansträngning få en omedelbar, dramatisk inverkan på prestanda - vanligtvis i storleksordning. En enkel lösning med en enorm fördel; det är så nära magi som du kan komma.

När ska jag använda Memcached

Memcached kan vara att föredra när man cachar relativt små och statiska data, såsom HTML-kodfragment. Memcaches interna minneshantering, även om det inte är så sofistikerat som Redis, är mer effektivt i de enklaste användningsfallet eftersom det förbrukar relativt mindre minnesresurser för metadata. Strängar (den enda datatypen som stöds av Memcached) är perfekta för att lagra data som bara läses, eftersom strängar inte behöver bearbetas längre.

Stora datamängder involverar ofta seriell data, vilket alltid kräver mer utrymme att lagra. Medan Memcached effektivt är begränsat till att lagra data i sin serieform, kan datastrukturerna i Redis lagra alla aspekter av datan, och därmed minska serialiseringskostnaderna.

Det andra scenariot där Memcached har en fördel jämfört med Redis är att skala. Eftersom Memcached är flertrådad kan du enkelt skala upp det genom att ge det fler beräkningsresurser, men du kommer att förlora en del eller hela cachadata (beroende på om du använder konsekvent hashing). Redis, som mestadels är engängad, kan skala horisontellt via kluster utan förlust av data. Clustering är en effektiv skalningslösning, men det är jämförelsevis mer komplex att installera och använda.

När ska jag använda Redis

Du vill nästan alltid använda Redis på grund av dess datastrukturer. Med Redis som cache får du mycket kraft (till exempel möjligheten att finjustera cacheinnehåll och hållbarhet) och högre effektivitet totalt sett. När du väl har använt datastrukturerna blir effektivitetshöjningen enorm för specifika applikationsscenarier.

Redis överlägsenhet är uppenbar i nästan alla aspekter av cachehantering. Cacher använder en mekanism som kallas datautkastning för att skapa plats för nya data genom att ta bort gamla data från minnet. Memcached's datautkastningsmekanism använder en algoritm som har använts minst nyligen och avläser något godtyckligt data som har samma storlek som de nya uppgifterna.

Redis, däremot, möjliggör finkornig kontroll över bortkastning, så att du kan välja mellan sex olika utvisningsregler. Redis använder också mer sofistikerade metoder för minneshantering och urval av kandidatval. Redis stöder både lat och aktiv utvisning, där data bara släpps ut när mer utrymme behövs eller proaktivt. 

Redis ger dig mycket större flexibilitet beträffande objekten du kan cache. Medan Memcached begränsar nyckelnamn till 250 byte och endast fungerar med vanliga strängar, tillåter Redis att nyckelnamn och värden kan vara så stora som 512 MB vardera, och de är binära säkra. Dessutom har Redis fem primära datastrukturer att välja mellan, vilket öppnar en värld av möjligheter för applikationsutvecklaren genom intelligent cachning och manipulering av cachad data.

Redis för uthållighet av data

Att använda Redis datastrukturer kan förenkla och optimera flera uppgifter - inte bara under cachning utan även när du vill att data ska vara beständiga och alltid tillgängliga. Till exempel, istället för att lagra objekt som seriesträngar, kan utvecklare använda en Redis Hash för att lagra ett objekts fält och värden och hantera dem med en enda nyckel. Redis Hash sparar utvecklare behovet av att hämta hela strängen, deserialisera den, uppdatera ett värde, omplacera objektet och byta ut hela strängen i cachen med dess nya värde för varje trivial uppdatering - det betyder lägre resursförbrukning och ökad prestanda.

Andra datastrukturer som erbjuds av Redis (som listor, uppsättningar, sorterade uppsättningar, hyperloggar, bitmappar och geospatiala index) kan användas för att implementera ännu mer komplexa scenarier. Sorterade uppsättningar för tidsserieintag och analys är ett annat exempel på en Redis-datastruktur som erbjuder enormt minskad komplexitet och lägre bandbreddskonsumtion.

En annan viktig fördel med Redis är att datan den lagrar inte är ogenomskinlig, så att servern kan manipulera den direkt. En stor del av de 180 plus-kommandona som finns tillgängliga i Redis ägnas åt databehandlingsoperationer och inbäddning av logik i själva datalagret via Lua-skript på serversidan. Dessa inbyggda kommandon och användarskript ger dig flexibiliteten att hantera databehandlingsuppgifter direkt i Redis utan att behöva skicka data över nätverket till ett annat system för bearbetning.

Redis erbjuder valfri och avstämbar datapersistens som är utformad för att starta upp cachen efter en planerad avstängning eller ett oplanerat fel. Medan vi tenderar att betrakta data i cachar som flyktiga och övergående, kan bestående data till disk vara mycket värdefullt i caching-scenarier. Att ha cachens data tillgängliga för laddning omedelbart efter omstart möjliggör mycket kortare cache-uppvärmning och tar bort belastningen som är involverad i ompopulering och omberäkning av cacheinnehåll från det primära datalagret.

Redis replikering av minnesdata 

Redis kan också replikera data som hanteras. Replikering kan användas för att implementera en mycket tillgänglig cache-inställning som tål misslyckanden och ger oavbruten service till applikationen. Ett cachefel saknas bara lite av applikationsfel när det gäller påverkan på användarupplevelse och applikationsprestanda, så det är i de flesta fall en stor fördel att ha en beprövad lösning som garanterar cachens innehåll och tillgänglighet.

Sist men inte minst, när det gäller operativ synlighet, ger Redis en massa mätvärden och en mängd introspektiva kommandon för att övervaka och spåra användning och onormalt beteende. Realtidsstatistik om alla aspekter av databasen, visning av alla kommandon som körs, listning och hantering av klientanslutningar - Redis har allt det och mer.

När utvecklare inser effektiviteten av Redis uthållighet och replikeringsfunktioner i minnet använder de den ofta som en förstasvar-databas, vanligtvis för att analysera och bearbeta höghastighetsdata och ge svar till användaren medan en sekundär (ofta långsammare) databas upprätthåller ett historiskt register över vad som hände. När det används på detta sätt kan Redis också vara perfekt för analysanvändningsfall.

Redis för dataanalys

Tre analysscenarier kommer omedelbart att tänka på. I det första scenariot, när du använder något som Apache Spark för att iterativt bearbeta stora datamängder, kan du använda Redis som ett serveringslager för data som tidigare beräknats av Spark. I det andra scenariot kan användningen av Redis som ditt delade, i minnet, distribuerade datalagring påskynda Spark-bearbetningshastigheter med en faktor på 45 till 100. Slutligen är ett alltför vanligt scenario ett där rapporter och analyser måste anpassas av användaren, men det tar för lång tid att hämta data från i sig batchdatalager (som Hadoop eller en RDBMS). I det här fallet är en datalagringsstorlek i minnet, såsom Redis, det enda praktiska sättet att få sökningar och svarstider under millisekund.

När du använder extremt stora operativa datauppsättningar eller analysarbetsbelastningar kanske det inte är kostnadseffektivt att köra allt i minnet. För att uppnå prestanda under millisekunder till lägre kostnad skapade Redis Labs en version av Redis som körs på en kombination av RAM och blixt, med möjlighet att konfigurera RAM-till-blixt-förhållanden. Även om detta öppnar upp flera nya vägar för att påskynda bearbetning av arbetsbelastning, ger det också utvecklare möjlighet att helt enkelt köra sin "cache på flash."

Programvara med öppen källkod fortsätter att tillhandahålla några av de bästa teknikerna som finns idag. När det gäller att öka applikationsprestanda genom cachning är Redis och Memcached de mest etablerade och produktionsbevisade kandidaterna. Med tanke på Redis rikare funktionalitet, mer avancerad design, många potentiella användningsområden och större kostnadseffektivitet i stor skala bör Redis vara ditt första val i nästan alla fall.

---

Itamar Haber (@itamarhaber) är chefsutvecklare för Redis Labs, som erbjuder Memcached och Redis som helt hanterade molntjänster för utvecklare. Hans mångsidiga erfarenhet inkluderar mjukvaruproduktutveckling och lednings- och ledarskapsroller vid Xeround, Etagon, Amicada och MNS Ltd. Itamar har en magisterexamen i företagsekonomi från det gemensamma Kellogg-Recanati-programmet från nordvästra och Tel-Aviv universitet samt en kandidatexamen datavetenskap.

New Tech Forum är en plats för att utforska och diskutera framväxande företagsteknologi i oöverträffat djup och bredd. Urvalet är subjektivt, baserat på vårt val av den teknik som vi anser vara viktig och av största intresse för läsarna. accepterar inte marknadsföringssäkerhet för publicering och förbehåller sig rätten att redigera allt innehåll som har bidragit. Skicka alla förfrågningar till [email protected]