Redis är ett datalager i minnet, vilket innebär att hela datasetet lagras i minnet (RAM). Även om detta är bra för prestanda, när storleken på datan börjar växa, behöver mer och mer RAM-minne läggas till för att hålla alla dessa data. Detta kan snabbt bli oöverkomligt dyrt och innan du vet ordet av börjar serverkostnaderna skjuta i höjden, vilket gör dig orolig för om Redis kan skala åt dig på ett kostnadseffektivt sätt.
Detta är naturligtvis ett vanligt problem med vilken databas som helst, men skadar mer i fallet med minnesdatabaser som Redis, eftersom RAM är dyrare än sekundär lagring som hårddiskar och SSD:er. Vi måste dock komma ihåg att Redis inte är avsedd att lagra terabyte med data för din applikation. Snarare är det tänkt att användas för att lagra specifikt den data som behöver läsas (och i mindre utsträckning, skrivas) i mycket hög hastighet, medan resten av dina data kan sitta på diskstödda traditionella databaser. För det ändamålet används Redis oftast som en cache, som bara innehåller de mest aktiva data med höga krav på läs/skrivkapacitet (tänk resultattavlor och chattmeddelanden i realtid). Därför är den främsta boven för överdriven minnesanvändning med Redis appbeteende. Din applikation kan lagra onödig data som inte tjänar på att vara i Redis, eller till och med helt redundant data, det vill säga data som aldrig har använts för något syfte, som den här användaren var.
För att diagnostisera problem med överdriven minnesanvändning behöver vi uppenbarligen ett sätt att ta reda på vilka nycklar som använder mest minne så att vi kan börja resonera om och förstå vilka beteenden hos applikationen som orsakar problemet. Kom ihåg att för tidig optimering är roten till allt ont, och Redis är inget undantag. Vi behöver absolut insyn i minnesegenskaperna för vår datauppsättning för att ens börja tänka på var problemet ligger och hur vi kan åtgärda det. Nedan utforskar vi några av de tillgängliga alternativen för att kika in i vår Redis-data och hitta de områden som kan dra nytta av optimering på applikationsnivå.
Kommandot MEMORY USAGE
Detta passande namn är tillgängligt sedan Redis 4.0.0 och är det första steget för att felsöka minnesproblem med Redis. Från dokumenten:
Kommandot MEMORY USAGE rapporterar antalet byte som en nyckel och dess värde kräver för att lagras i RAM. Den rapporterade användningen är summan av minnesallokeringar för data och administrativa omkostnader som en nyckel som dess värde kräver.
Här är ett exempel:
MEMORY USAGE users_by_reputation
(integer) 2923419
Ett enkelt heltal som representerar antalet byte som används för att lagra nyckeln, värdet och interna omkostnader returneras. För att snabbt hitta minnesanvändningen för en viss nyckel blir det inte enklare än så här.
Två möjliga nackdelar är:
- Detta kommando är endast tillgängligt i Redis 4.0.0 och senare. Detta utesluter de flesta molnleverantörer.
- Den talar bara om minnet som används av en enskild nyckel, så om du inte i förväg vet vilken eller vilka nycklar som orsakar problemet, har detta kommando mycket begränsad användbarhet.
redis-rdb-tools
redis-rdb-tools är ett tjusigt litet kommandoradsverktyg som går utöver den ödmjuka MEMORY USAGE
kommando som vi diskuterade ovan. Det är ett populärt och kraftfullt minnesprofileringsverktyg byggt specifikt för Redis som analyserar en Redis-dump (.rdb)-fil och genererar en detaljerad minnesprofil för varje nyckel i dumpen, inklusive detaljer som det använda minnet, datatyp, antal element, etc. Det låter dig också filtrera de nycklar som bearbetas, så att du valfritt kan köra analysen på en viss nyckel eller en delmängd av nycklar som matchar ett visst mönster. Resultatet av analysen är en CSV-fil med kolumner för nyckeln, använt minne, datatyp, antal element, etc.
Det här verktyget är så bra eftersom, till skillnad från MEMORY USAGE
kommando, som bara fungerar på en enda nyckel, det här verktyget analyserar hela datasetet och spottar ut resultatet i CSV-format, vilket innebär att du kan ladda det till vilken SQL-databas som helst och utföra vilka frågor du vill, sortera och filtrera det som du vill , med all kraft av SQL, vilket ger dig stor insikt i minneskostnaden för dina data. Som en bonus, om du använder Redis-versioner före 4.0.0, kan du fortfarande använda det här verktyget för att analysera enstaka nycklar om du vill, eftersom detta verktyg fungerar genom att analysera den binära dumpen som Redis producerar, istället för att förlita sig på Redis för att rapportera minnesanvändning. Å andra sidan betyder denna skillnad i tillvägagångssätt att den beräknade minnesanvändningen mer är en uppskattning än en exakt siffra, som nämns i projektets dokumentation. Men detta är egentligen inget problem när vårt mål är att identifiera problem med minnesanvändning, eftersom vi är mer intresserade av relativa storlekar på nycklarna och identifiera nycklar som använder betydligt mer minne som de borde använda, så några byte här eller där är verkligen irrelevant.
RDBT-verktyg
RDBTools är ett webbaserat verktyg som erbjuder flera verktyg för att hantera och optimera Redis, med huvudfokus på minnesoptimering. Det föddes ur redeis-rdb-tools-projektet med öppen källkod som diskuterades ovan. Med den kan vi enkelt analysera vår Redis-servers minnesanvändning genom att helt enkelt peka på vår instans och klicka på "Analysera". Verktyget laddar ner en dump från den körande instansen och analyserar den, vilket ger dig ett snyggt användargränssnitt för att filtrera och sortera dina nycklar baserat på olika parametrar som minnesanvändning, datatyp, kodning, antal element, etc., liknande kommandoraden verktyg, men utan den manuella ansträngningen som är involverad i att ta en dump, generera minnesprofilen, ställa in en databas, importera profilen, skriva och köra frågor, etc.
Förutom det genererar RDBTools också flera diagram och grafer från minnesprofilen som ger dig ännu större insikt i din data, tillsammans med rekommendationer för att optimera konfigurationen av din Redis-server, baserat på industristandarder och många års erfarenhet av att optimera Redis, för att pressa ut ännu mer minnesbesparingar. Förutom minnesoptimering finns det en mängd andra funktioner användbara för alla som använder Redis, som en inbyggd rik CLI, konfigurationsredigerare med inline-dokumentation, rik livedatavisualiserare, etc.
RDBTools är tillgänglig som en docker-bild, tillgänglig i docker-hubben och kan köras på din egen maskin, så du behöver inte oroa dig för att läcka känslig data. En testversion är tillgänglig gratis för alltid, med vissa användningsgränser. Se prissidan för mer information om de olika betalabonnemang som finns tillgängliga.
Slutsats
Att ta slut på minne är ett oundvikligt problem när man använder minnesdatabaser som Redis. Som alla optimeringsproblem är det första steget att diagnostisera problemet korrekt. Det är viktigt att motstå frestelsen att snabbt dra slutsatser baserade på overifierade hypoteser. ”Mäta, mäta, mäta” är namnet på spelet när det kommer till optimering och det finns olika metoder och verktyg för att få insikt i dina Redis-minnesproblem. Vilken som är bäst beror på dina specifika behov och var du befinner dig i utvecklingsprocessen. För någon som precis börjat använda Redis kan det räcka med att hålla ett öga på individuella nycklar för att starta, medan för tunga användare av Redis är det verkligen vettigt att välja ett dedikerat GUI-verktyg med alla klockor och visselpipor för att spara smärta senare. Oavsett vad du väljer, se alltid till att förstå roten till ditt problem innan du försöker lösa det, och kom ihåg att om du har minnesproblem med Redis så använder du förmodligen mer minne än du verkligen behöver.