Redis står för RE mote DI ordbok S erver, skapad 2009 av Salvatore Sanfilippo. Memcached, å andra sidan, skapades 2003 av Brad Fitzpatrick. Både Redis och Memcached är:
- NoSQL-datastrukturer i minnet
- Skrivt i C
- Öppen källkod
- Används för att snabba upp applikationer
- Stöd under millisekunders latens
2014 skrev Salvatore ett utmärkt StackOverflow-inlägg om när det är mer meningsfullt att använda Memcached än Redis. I det här inlägget ger vi en aktuell och detaljerad jämförelse mellan Redis och Memcached så att du kan göra ett välgrundat val om deras användning i din applikation.
Infografik
Det här inlägget har komprimerats till infografiken nedan. Med den här infografiken kan du enkelt visualisera resultaten av denna jämförelse för att se vilken som kommer bäst i olika scenarier. Om du vill läsa jämförelsen i textformat, klicka här.
Dokumentation
Till att börja med är Redis mycket mer omfattande dokumenterat än Memcached. Detta gör det lättare att lära sig, administrera och använda.
Databasmodell
Redis är i första hand en nyckelvärdesbutik. Medan nycklar är binära strängar, är fördelen med Redis att värdet inte är begränsat till endast binära strängar. De kan vara en mängd olika datastrukturer som möjliggör lagring av komplexa objekt och ger en rik uppsättning operationer över dem. Redis tillhandahåller även utökbarhet via Redis-moduler. Redis-moduler är tillägg som tillhandahåller ytterligare datastrukturer och funktioner som inte är tillgängliga inom kärnfunktionsuppsättningen. Här är ett exempel på några funktioner som nu är tillgängliga som moduler:
- Document Store
- Diagram DBMS
- Sökmotor
- Time Series DBMS
Memcached är en vanlig nyckelvärdeslagring som endast stöder binära strängar som värde.
Datastrukturer
Som nämnts ovan erbjuder Redis flera typer av datastrukturer som gör att den kan vara extremt flexibel att använda, inklusive Strings, Hashes, Lists, Sets, Sorterade Sets, Bitmaps, Bitfields, HyperLogLog, Geospatiala index och strömmar. Du kan lära dig mer om dessa i den här artikeln Top Redis Use Cases by Core Data Structure Types.
Bildkälla:https://redislabs.com/redis-enterprise/data-structures/
Memcached stöder bara vanliga binära strängar som är bra för skrivskyddad data, så om du inte behöver alla klockor och visselpipor från Redis är Memcached en enklare databas för dig att använda.
Databasrankning och popularitet
Den större populariteten för en databas resulterar i en större gemenskap av användare, fler diskussioner och användargenererade handledningar och mer hjälp och support genom tredjepartsverktyg som DBaaS-plattformar och analysverktyg som hjälper dig att optimera dina distributioner.
Redis är den 8:e mest populära databasen i världen i februari 2021, enligt DB-Engines på grund av dess enkelhet, rika datastrukturer och fantastiska dokumentation. Memcached är för närvarande rankad som den 28:e mest populära databasen. När Redis och Memcached rankas med avseende på nyckel-värde databasmodeller, hamnar Redis på första plats och Memcached kommer på fjärde plats. Men om du bara letar efter en nyckel-värdesdatabas med öppen källkod, eller en som kan distribueras på plats, kommer Memcached på andra plats eftersom både Amazon DynamoDB och Microsoft Azure Cosmos DB båda är kommersiella databaser som endast kan distribueras i molnet.
Arkitektur
Redis och Memcached följer båda klient-server arkitektur. Klienter fyller i data på servern i form av nyckel-värde.
Redis är enkeltrådad där Memcached å andra sidan har en flertrådad arkitektur. Memcached skalar bättre på ett system med fler kärnor som kan hantera fler operationer om beräkningskapaciteten skalas. Mer än en Redis-instans kan dock initieras på samma system för att använda ytterligare kärnor.
Användarvänlighet
Som förklarat ovan i avsnittet Databasmodell kan Redis, som är en multimodelldatabas, användas med vilken typ av datamodell som helst. I Redis är det lätt att skriva kod eftersom det förenklar komplexa uppgifter. Redis har avancerade datastrukturer och är inte begränsad till enkla strängvärden. Till exempel, om din applikation lagrar data i uppsättningar och du vill hålla reda på uppsättningar i en lista kan du göra detta enkelt i Redis. En liknande uppgift på Memcached är inte möjlig. Men det finns andra sätt att utföra samma uppgifter som kräver fler rader kod.
Memcached, å andra sidan, lagrar bara vanliga strängvärden. Så, applikationen får ta itu med datastrukturens komplexitet.
Datapartitionering
Redis stöder partitionering av data över flera nodinstanser. Nuvarande användare av Redis utnyttjar olika tekniker som intervallpartitionering, hashpartitionering och konsekvent hashning för datapartitionering. I Redis kan datapartitionering implementeras på tre olika sätt:
- Partitionering på klientsidan
- Proxyassisterad partitionering (exempel:twemproxy)
- Partitionering på serversidan med frågedirigering inom klusternoderna
Memcached stöder även datapartitionering över flera noder, och konsekvent hashning är en rekommenderad metod för att säkerställa att trafikbelastningen är jämnt fördelad.
Redis vs Memcached - 2021 JämförelseKlicka för att tweetaSpråk som stöds
Redis stöder nästan alla de mest använda programmeringsspråken, från högnivå- till lågnivåspråk. Memcached stöder dock färre antal språk jämfört med Redis, men stöder alla populära språk.
Memcachad
- .Net
- C
- C++
- ColdFusion
- Erlang
- Java
- Lisp
- Lua
- OCaml
- Perl
- PHP
- Python
- Ruby
Redis
- C
- C#
- C++
- Clojure
- Kristall
- D
- Dart
- Elixir
- Erlang
- Fantiskt
- Gå
- Haskell
- Haxe
- Java
- JavaScript (Node.js)
- Lisp
- Lua
- MatLab
- Mål-C
- OCaml
- Pascal
- Perl
- PHP
- Prolog
- Ren data
- Python
- R
- Rebol
- Ruby
- Rost
- Scala
- Schema
- Smaltalk
- Snabb
- Tcl
- Visual Basic
Transaktioner
Redis "transaktioner" utförs med de tre nedanstående garantierna:
- Transaktioner serialiseras och körs sekventiellt
- Antingen bearbetas alla kommandon, eller inga, (atomära transaktioner)
- Optimistisk låsning ger en extra garanti med check-and-set
Redis ser till att bara ett kommando från en klientdator exekveras samtidigt. Alla kommandon i transaktionerna exekveras när kommandot "EXEC" anropas för att säkerställa atomiciteten.
Memcached, å andra sidan, tillhandahåller inte transaktionshantering.
Replikering
Redis erbjuder en enkel replikering av ledare-följare (master-slave) som skapar exakta kopior av master-instanserna, med dessa funktioner:
- Mastaren fortsätter att skicka datakommandon till slaven så länge de är anslutna.
- Om anslutningen bryts kommer slaven att följa en partiell omsynkronisering och kopiera endast data som missades under frånkopplingen.
- Om partiell omsynkronisering inte är möjlig kommer den att försöka en fullständig omsynkronisering.
Du kan också utnyttja funktionerna med hög tillgänglighet, Redis Sentinels eller Redis Cluster, för avancerat säkerhetsskydd.
Native Memcached stöder inte replikering, men du kan använda Repcached, en gratis patch för öppen källkod för att uppnå hög tillgänglighet för din distribution. Den erbjuder multimasterreplikering, asynkron datareplikering och stöder alla Memcached-kommandon.
Ögonblicksbilder/uthållighet
Ögonblicksbilder är helt enkelt en skrivskyddad vy av din databas som den var vid en viss tidpunkt. Redis stöder ögonblicksbilder, och som standard sparar Redis ögonblicksbilder av datamängden på disken i en binär fil som heter dump.rdb. Du kan anropa en ögonblicksbild manuellt eller anpassa frekvensen eller ändra tröskeln för att köra operationen.
Här är de två beständighetsalternativen som Redis stöder:
- RDB-beständighet
- AOF-beständighet
RDB står för "Redis Database Backup". Det är en kompakt ögonblicksbild av databasen vid en viss tidpunkt. Det tar mindre utrymme, maximerar Redis prestanda och är bra för katastrofåterställning.
AOF står för "Lägg endast till fil". AOF håller reda på alla kommandon som exekveras och i en katastrofal situation kör den om kommandona för att få tillbaka data. Den här metoden tar mer utrymme eftersom alla kommandon körs igen, och är inte en särskilt hållbar metod för ögonblicksbilder.
Memcached stöder å andra sidan inte hårddiskbeständighet.
Skript på serversidan
Lua är det inbäddade skriptspråket för din Redis-server, tillgängligt från och med version 2.6, vilket låter dig utföra operationer inuti Redis för att förenkla din kod och öka prestandan. De två huvudfunktionerna som används för att utvärdera skript med Lua-tolken är:
- EVAL
- EVALSHA
När Lua-skriptet körs blockeras alla andra förfrågningar som visas i bilden nedan.
Redis inkluderar även Lua scripts debugger i version 3.2 som gör det enklare att skriva komplexa skript och hjälper till att förbättra prestandan.
Memcached stöder inte något skript på serversidan.
Skalbarhet
Det finns två tekniker för att horisontellt skala din Redis-databas:
- Lägga till skärvor i Redis Clusters
- Lägga till noder i en Redis HA-inställning (master/replik)
Du kan även skala din Redis-inställning vertikalt när du behöver mer minne eller dator. Det kan göras utan driftstopp om du har en HA-inställning eller om du använder Redis Cluster-teknik.
Den Memcachade servern tillhandahåller ingen mekanism för att distribuera data över noder (sharding). Så i Memcached är horisontell skalbarhet lika enkelt som att lägga till fler noder – problemet med att partitionera dina data i olika skärvor måste göras på applikations-/klientnivå. Det finns några verktyg med öppen källkod som kan hjälpa dig med detta.
Kommunikationsprotokoll
Redis använder TCP som nätverksprotokoll och stöder inte UDP.
Memcached stöder både TCP- och UDP-kommunikationsprotokollen. Data skickas till Memcached-servern i två former:
- Textrader:Skicka kommandon och ta emot svar från servern.
- Ostrukturerad data:Ta emot eller skicka värdeinformation för en given nyckel, och data returneras i samma format som tillhandahålls.
Policyer för cacheavhysning som stöds
Redis stöder olika typer av vräkningspolicyer. Låt oss ta en titt på några.
- ej avfärd: I "noeviction" returneras ett fel när minnet når det bundna.
- allkeys-lru: Lru står för "senast använde". Den här policyn tar bort de minst senast använda data.
- allkeys-lfu: Lfu står för "minst ofta använda". Denna policy tar bort de minst använda uppgifterna.
- allkeys-random: Denna policy tar bort data slumpmässigt.
- volatile-lru: Flyktiga data är med utgångsdatauppsättning. Denna policy tar bort den minst nyligen använda flyktiga informationen.
- volatile-lfu: Flyktiga data är med utgångsdatauppsättning. Denna policy tar bort de minst frekvent använda flyktiga uppgifterna.
- flyktigt-slumpmässigt: Denna policy tar bort flyktiga data slumpmässigt.
- volatile-ttl: "TTL" står för tid att leva. Den här policyn tar bort de data som har kortast tid att leva.
Memcached använder LRU-algoritm för att avhysa data när utrymme krävs. Den söker först efter redan utgångna data för att radera om utgångna data inte är tillgängliga används LRU-algoritmen.
Publicera och prenumerera på meddelanden
Redis stöder Pub/Sub-meddelanden (publicera och prenumerera). Det finns tre kommandon som används för detta ändamål.
Klienten använder:
- Prenumerera
- Avsluta prenumeration
Prenumerera och avsluta prenumerationen används för att få meddelanden från en specifik kanal.
Servern använder:
- Publicera
"Publicera" används för att skicka data till klienterna.
Memcached stöder inte publicering och prenumeration av meddelanden.
Stöd för strömmar
Redis stöder Kafka-liknande strömmar med 5.0 eller högre version med en ny datastruktur "Redis Streams". Redis Streams har konceptet med konsumentgrupper, som Apache Kafka, som låter klientapplikationer konsumera meddelanden på ett distribuerat sätt, vilket gör det enkelt att skala och skapa högt tillgängliga system.
Memcached erbjuder inte inbyggt stöd för strömmar, men det finns biblioteksverktyg med öppen källkod som Kafcache för strömbehandling med låg latens.
Geospatial support
Redis har en datastruktur som kallas Geospatiala index som lagrar longitud- och latituddata för en plats. Du kan utföra olika operationer på geospatiala data, som att beräkna avståndet mellan två punkter eller hitta närliggande platser.
Memcached har inga speciella datastrukturer för att hantera geospatial data.
Prestanda
En prestandajämförelse mellan nyckel-värdesdatalager i minnet är mer av en intellektuell övning än av någon praktisk betydelse – såvida du inte distribuerar system i en sådan skala att detta blir intressant som en kostnadsbesparande åtgärd. Detta beror på att sådana butiker är IO-bundna och vanligtvis kan nätverkslatensen spela en större roll i applikationens upplevda latens än databasens latens.
En mer praktisk prestandaaspekt är lagringseffektivitet – hur mycket data kan packas i samma mängd minne. Även här varierar de interna datastrukturerna som används av Redis beroende på datastorleken. Så alla diskussioner om prestanda mellan dessa databaser bör tas med en nypa salt.
Låt oss ta en titt på några jämförelser som visas i en forskningsartikel från 2016. I den här artikeln experimenterar författarna de mycket använda minnesdatabaserna för att mäta deras prestanda i termer av:
- Tiden det tar att slutföra operationer.
- Hur effektivt de använder minne under drift.
Databasversioner som används i tidningen:
Databas | Version |
---|---|
Redis | 3.0.7 |
Memcachad | 1.4.14 |
Skriv operation
Medan du skriver data, som du kan se, visar Memcached i tabellen nedan exceptionell hastighet även efter att antalet poster flyttats upp till miljoner.
Den beräknade tiden för att skriva nyckel-värdepar (ms)
Antal poster | ||||
---|---|---|---|---|
Databas | 1 000 | 10 000 | 100 000 | 1 000 000 |
Redis | 34 | 214 | 1 666 | 14 638 |
Memcachad | 23 | 100 | 276 | 2 813 |
Läs Operation
Läsdata förblir nästan konsekvent i Redis även för en miljon poster, men i Memcached ökar tiden också en aning när antalet poster ökar.
Den tid som förflutit för att läsa värdet som motsvarar en given nyckel per databas (ms)
Antal poster | ||||
---|---|---|---|---|
Databas | 1 000 | 10 000 | 100 000 | 1 000 000 |
Redis | 8 | 6 | 8 | 8 |
Memcachad | 9 | 14 | 14 | 30 |
Minnesanvändning
Medan man diskuterar minnesanvändning är Redis alltid bäst som du kan se i resultaten.
Minnesanvändning av minnesdatabaser för skrivoperation (MB)
Antal poster | ||||
---|---|---|---|---|
Databas | 1 000 | 10 000 | 100 000 | 1 000 000 |
Redis | 2.5 | 3.8 | 4.3 | 62.7 |
Memcachad | 5.3 | 27.2 | 211 | 264.9 |
Som du kan se är Redis bättre än Memcached.
Minnesanvändning av databaser i minnet för raderingsoperation (MB)
Antal poster | ||||
---|---|---|---|---|
Databas | 1 000 | 10 000 | 100 000 | 1 000 000 |
Redis | 0 | 0 | 0 | 0 |
Memcachad | 2.2 | 2.1 | 2.2 | 2.2 |
Managed Services/Support
Den ökade populariteten och gemenskapen för Redis har också drivit på behovet av hanterade tjänster, hosting och support. Populära hanterade databasleverantörer för Redis™* inkluderar ScaleGrid, Redis Labs, AWS Elasticache, Azure Cache och DigitalOcean. Den här sidan ger en bra jämförelse av de bästa leverantörerna för Redis™. Redis har också omfattande interna rapporteringsverktyg som cacheträffar, minnesanvändning, ops och till och med en långsam fråga som loggas.
Hanterade tjänster för Memcached är mycket mindre tillgängliga, men stöds fortfarande via Amazon Elasticache.
Stöd för Transport Layer Security (TLS)
Redis har inbyggt TLS-stöd från Redis 6.0. Tidigare versioner av Redis rekommenderade användningen av stunnel för att tillhandahålla TLS-stöd.
Memcached 1.5.13 och senare versioner stöder autentisering och kryptering via TLS. Den här funktionen är fortfarande i experimentstadiet.
Autentisering
Upp till Redis 5.x stödde Redis endast en enkel lösenordsbaserad autentisering. Detta lösenord lagrades i klartext på servern. Redis i version 6.0 och framåt stöder en fullfjädrad ACL.
Memcachad version 1.4.3 och senare har SASL-stöd. Tidigare hade Memcached inget autentiseringslager.
Sammanfattning
Redis och Memcached är båda fantastiska och har applikationer inom olika områden. Redis som utvecklas senare har många avancerade funktioner och har fantastisk dokumentation och community.
|
*Redis är ett varumärke som tillhör Redis Labs Ltd. Alla rättigheter därtill är förbehållna Redis Labs Ltd. All användning av ScaleGrid är endast för referensändamål och indikerar inte någon sponsring, stöd eller koppling mellan Redis och ScaleGrid.