sql >> Database >  >> NoSQL >> Redis

Redis vs. Memcached – 2021 Vergelijking

Redis staat voor RE mot DI ctionary S erver, opgericht in 2009 door Salvatore Sanfilippo. Memcached daarentegen is in 2003 gemaakt door Brad Fitzpatrick. Zowel Redis als Memcached zijn:

  • NoSQL in-memory datastructuren
  • Geschreven in C
  • Open source
  • Gebruikt om applicaties te versnellen
  • Ondersteuning van een latentie van minder dan een milliseconde

In 2014 schreef Salvatore een uitstekende StackOverflow-post over wanneer het logischer is om Memcached te gebruiken dan Redis. In dit bericht bieden we een actuele en gedetailleerde vergelijking tussen Redis en Memcached, zodat u een weloverwogen keuze kunt maken over het gebruik ervan in uw toepassing.

Infografische

Dit bericht is samengevat in de onderstaande infographic. Met deze infographic kun je eenvoudig de resultaten van deze vergelijking visualiseren om te zien welke er in verschillende scenario's als beste uitkomt. Als je de vergelijking in tekstformaat wilt lezen, klik dan hier.

Documentatie

Om te beginnen is Redis veel uitgebreider gedocumenteerd dan Memcached. Dit maakt het gemakkelijker om te leren, te beheren en te gebruiken.

Databasemodel

Redis is in de eerste plaats een sleutelwaardeopslag. Hoewel sleutels binaire tekenreeksen zijn, is het voordeel van Redis dat de waarde niet beperkt is tot alleen binaire tekenreeksen. Ze kunnen een verscheidenheid aan gegevensstructuren zijn die het opslaan van complexe objecten mogelijk maken en een uitgebreide reeks bewerkingen daarop bieden. Redis biedt ook uitbreidbaarheid via Redis-modules. Redis-modules zijn uitbreidingen die voorzien in aanvullende gegevensstructuren en functies die niet beschikbaar zijn binnen de kernfunctieset. Hier is een voorbeeld van enkele functies die nu beschikbaar zijn als modules:

  • Documentwinkel
  • Grafiek-DBMS
  • Zoekmachine
  • Time Series DBMS

Memcached is een gewone sleutelwaardeopslag die alleen binaire strings als waarde ondersteunt.

Gegevensstructuren

Zoals hierboven vermeld, biedt Redis meerdere datastructuurtypes waardoor het extreem flexibel te gebruiken is, inclusief Strings, Hashes, Lists, Sets, Sorted Sets, Bitmaps, Bitfields, HyperLogLog, Geospatiale indexen en Streams. U kunt hier meer over leren in dit artikel Top Redis Use Cases per Core Data Structure Types.

Bron afbeelding:https://redislabs.com/redis-enterprise/data-structures/

Memcached ondersteunt alleen gewone binaire strings die geweldig zijn voor alleen-lezen gegevens, dus als je niet alle toeters en bellen van Redis nodig hebt, is Memcached een eenvoudigere database voor jou te gebruiken.

Databaserang en populariteit

De grotere populariteit van een database resulteert in een grotere gebruikersgemeenschap, meer discussies en door gebruikers gegenereerde tutorials, en meer hulp en ondersteuning via tools van derden, zoals DBaaS-platforms en analysetools om uw implementaties te optimaliseren.

Redis is volgens DB-Engines de 8e meest populaire database ter wereld sinds februari 2021 vanwege zijn eenvoud, rijke datastructuren en geweldige documentatie. Memcached is momenteel gerangschikt als de 28e meest populaire database. Wanneer Redis en Memcached worden gerangschikt met betrekking tot databasemodellen met sleutelwaarden, staat Redis op de eerste plaats en op de vierde plaats in Memcached. Als u echter alleen op zoek bent naar een open-source key-value-database, of een die on-premise kan worden geïmplementeerd, komt Memcached op de 2e plaats, aangezien zowel Amazon DynamoDB als Microsoft Azure Cosmos DB beide commerciële databases zijn die alleen kunnen worden ingezet in de cloud.

Architectuur

Redis en Memcached volgen beide client-server architectuur. Clients vullen de gegevens op de server in in de vorm van een sleutelwaarde.

Redis is single threaded waar Memcached daarentegen een multithreaded architectuur heeft. Memcached schaalt beter op een systeem met meer kernen dat meer bewerkingen aankan als de rekencapaciteit wordt geschaald. Er kan echter meer dan één Redis-instantie op hetzelfde systeem worden gestart om extra cores te gebruiken.

Gebruiksgemak

Zoals hierboven uitgelegd in het gedeelte Databasemodel, kan Redis, omdat het een database met meerdere modellen is, worden gebruikt met elk type gegevensmodel. In Redis is het gemakkelijk om code te schrijven omdat het complexe taken vereenvoudigt. Redis heeft geavanceerde gegevensstructuren en is niet beperkt tot eenvoudige tekenreekswaarden. Als uw applicatie bijvoorbeeld gegevens in sets opslaat en u sets in een lijst wilt bijhouden, kunt u dit eenvoudig doen in Redis. Een soortgelijke taak op Memcached is niet mogelijk. Maar er zijn andere manieren om dezelfde taken uit te voeren waarvoor meer regels code nodig zijn.

Memcached daarentegen slaat alleen gewone tekenreekswaarden op. De applicatie wordt dus overgelaten aan de complexiteit van de datastructuur.

Gegevenspartitionering

Redis ondersteunt het partitioneren van gegevens over meerdere knooppuntinstanties. Huidige gebruikers van Redis maken gebruik van verschillende technieken, zoals range-partitionering, hash-partitionering en consistente hashing voor datapartitionering. In Redis kan gegevenspartitionering op drie verschillende manieren worden geïmplementeerd:

  • Client-side partitionering
  • Proxy-ondersteunde partitionering (voorbeeld:twemproxy)
  • Partitionering aan serverzijde met routering van query's binnen de clusterknooppunten

Memcached ondersteunt ook gegevenspartitionering over meerdere knooppunten, en consistente hashing is een aanbevolen aanpak om ervoor te zorgen dat de verkeersbelasting gelijkmatig wordt verdeeld.

Redis vs Memcached - 2021 VergelijkingKlik om te tweeten

Ondersteunde talen

Redis ondersteunt bijna alle meest gebruikte programmeertalen, van talen op hoog niveau tot talen op laag niveau. Memcached ondersteunt echter minder talen dan Redis, maar ondersteunt wel alle populaire talen.

Memcached

  • .Net
  • C
  • C++
  • ColdFusion
  • Erlang
  • Java
  • Lisp
  • Lua
  • OCaml
  • Perl
  • PHP
  • Python
  • Ruby

Opnieuw

  • C
  • C#
  • C++
  • Clojure
  • Kristal
  • D
  • Dart
  • Elixer
  • Erlang
  • Fijn
  • Ga
  • Haskell
  • Haxe
  • Java
  • JavaScript (Node.js)
  • Lisp
  • Lua
  • MatLab
  • Doelstelling-C
  • OCaml
  • Pascal
  • Perl
  • PHP
  • Proloog
  • Pure gegevens
  • Python
  • R
  • Rebol
  • Ruby
  • Roest
  • Scala
  • Schema
  • Smalltalk
  • Snel
  • Tcl
  • Visuele basis

Transacties

Redis-transacties worden uitgevoerd met de drie onderstaande garanties:

  • Transacties worden geserialiseerd en opeenvolgend uitgevoerd
  • Of alle commando's, of geen, worden verwerkt (atomaire transacties)
  • Optimistische vergrendeling biedt extra garantie met check-and-set

Redis zorgt ervoor dat slechts één commando van één clientcomputer tegelijk wordt uitgevoerd. Alle opdrachten in de transacties worden uitgevoerd wanneer de opdracht "EXEC" wordt aangeroepen om de atomiciteit te garanderen.

Memcached daarentegen biedt geen transactiebeheer.

Replicatie

Redis biedt een eenvoudige leider-volger (master-slave) replicatie die exacte kopieën van de hoofdinstanties maakt, met de volgende functies:

  • De master blijft gegevenscommando's naar de slave sturen zolang ze verbonden zijn.
  • Als de verbinding wordt verbroken, volgt de slave een gedeeltelijke hersynchronisatie en kopieert alleen de gegevens die tijdens het verbreken zijn gemist.
  • Als gedeeltelijke hersynchronisatie niet mogelijk is, zal het een volledige hersynchronisatie proberen.

U kunt ook gebruikmaken van de functies voor hoge beschikbaarheid, Redis Sentinels of Redis Cluster, voor geavanceerde failover-bescherming.

Native Memcached ondersteunt geen replicatie, maar je kunt Repcached gebruiken, een gratis open source-patch om hoge beschikbaarheid voor je implementatie te bereiken. Het biedt multimaster-replicatie, asynchrone gegevensreplicatie en ondersteunt alle Memcached-commando's.

Momentopnamen/persistentie

Momentopnamen zijn gewoon een alleen-lezen weergave van uw database zoals deze op een bepaald moment was. Redis ondersteunt snapshots en standaard slaat Redis snapshots van de dataset op schijf op in een binair bestand met de naam dump.rdb. U kunt handmatig een momentopname oproepen, of de frequentie aanpassen of de drempel wijzigen voor het uitvoeren van de bewerking.

Dit zijn de twee persistentie-opties die Redis ondersteunt:

  • RDB-persistentie
  • AOF-persistentie

RDB staat voor "Redis Database Backup". Het is een compacte momentopname van de database op een bepaald tijdstip. Het neemt minder ruimte in beslag, maximaliseert de Redis-prestaties en is goed voor noodherstel.

AOF staat voor "Append Only File". AOF houdt alle uitgevoerde opdrachten bij en voert in een rampzalige situatie de opdrachten opnieuw uit om de gegevens terug te krijgen. Deze methode neemt meer ruimte in beslag omdat alle opdrachten opnieuw worden uitgevoerd en is geen erg duurzame methode voor het maken van snapshots.

Memcached daarentegen biedt geen ondersteuning voor schijfpersistentie.

Server-Side Scripts

Lua is de ingebedde scripttaal voor uw Redis-server, beschikbaar vanaf versie 2.6, waarmee u bewerkingen in Redis kunt uitvoeren om uw code te vereenvoudigen en de prestaties te verbeteren. De twee belangrijkste functies die worden gebruikt om scripts te evalueren met behulp van de Lua-interpreter zijn:

  • EVAL
  • EVALSHA

Als het Lua-script wordt uitgevoerd, worden alle andere verzoeken geblokkeerd, zoals weergegeven in de onderstaande afbeelding.

Redis bevat ook debugger voor Lua-scripts in versie 3.2, wat het schrijven van complexe scripts eenvoudiger maakt en helpt bij het verbeteren van de prestaties.

Memcached ondersteunt geen server-side scripting.

Schaalbaarheid

Er zijn twee technieken om uw Redis-database horizontaal te schalen:

  • Shards toevoegen in Redis-clusters
  • Nodes toevoegen aan een Redis HA (master/replica) setup

Je kunt je Redis-configuratie ook verticaal schalen als je meer geheugen of rekenkracht nodig hebt. Het kan worden gedaan zonder downtime als u een HA-configuratie heeft of als u Redis Cluster-technologie gebruikt.

De Memcached-server biedt geen mechanisme om gegevens over nodes te verdelen (sharding). Dus in Memcached is horizontale schaalbaarheid net zo eenvoudig als het toevoegen van meer knooppunten - het probleem van het partitioneren van uw gegevens in verschillende shards zal op applicatie-/clientniveau moeten worden gedaan. Er zijn enkele open source-tools die u hierbij kunnen helpen.

Communicatieprotocol

Redis gebruikt TCP als netwerkprotocol en ondersteunt geen UDP.

Memcached ondersteunt zowel de TCP- als UDP-communicatieprotocollen. Gegevens worden in twee vormen naar de Memcached-server verzonden:

  • Tekstregels:stuur opdrachten en ontvang reacties van de server.
  • Ongestructureerde gegevens:ontvang of verzend waarde-informatie voor een bepaalde sleutel en gegevens worden geretourneerd in hetzelfde formaat als opgegeven.

Ondersteund beleid voor uitzetten van caches

Redis ondersteunt verschillende soorten uitzettingsbeleid. Laten we er een paar bekijken.

  • noeviction:  In "noeviction" wordt een fout geretourneerd wanneer het geheugen de grens bereikt.
  • allkeys-lru:  Lru staat voor "minst recent gebruikt". Dit beleid verwijdert de minst recent gebruikte gegevens.
  • allkeys-lfu:  Lfu staat voor "minst frequent gebruikt". Dit beleid verwijdert de minst vaak gebruikte gegevens.
  • allkeys-random:  Dit beleid verwijdert de gegevens willekeurig.
  • vluchtige-lru:  Vluchtige gegevens zijn met vervaldataset. Dit beleid verwijdert de minst recent gebruikte vluchtige gegevens.
  • vluchtige-lfu:  Vluchtige gegevens zijn met vervaldataset. Dit beleid verwijdert de minst vaak gebruikte vluchtige gegevens.
  • vluchtig-willekeurig:  Dit beleid verwijdert de vluchtige gegevens willekeurig.
  • vluchtig-ttl:  "TTL" staat voor tijd om te leven. Dit beleid verwijdert de gegevens die de kortste levensduur hebben.

Memcached gebruikt het LRU-algoritme om gegevens te verwijderen wanneer er ruimte nodig is. Het zoekt eerst naar de reeds verlopen gegevens om te verwijderen als verlopen gegevens niet beschikbaar zijn, het LRU-algoritme wordt gebruikt.

Berichten publiceren en abonneren

Redis ondersteunt Pub/Sub-berichten (publiceren en abonneren). Er zijn drie commando's die voor dit doel worden gebruikt.

De klant gebruikt:

  • Abonneren
  • Afmelden

Abonneren en afmelden worden gebruikt om berichten van een specifiek kanaal te ontvangen.

De server gebruikt:

  • Publiceren

De "publish" wordt gebruikt om gegevens naar de clients te pushen.

Memcached ondersteunt geen berichten voor publiceren en abonneren.

Ondersteuning voor streams

Redis ondersteunt Kafka-achtige streams met 5.0 of hogere versie met behulp van een nieuwe datastructuur "Redis Streams". Redis Streams heeft het concept van consumentengroepen, zoals Apache Kafka, waarmee clientapplicaties berichten op een gedistribueerde manier kunnen consumeren, waardoor het eenvoudig is om te schalen en systemen met hoge beschikbaarheid te creëren.

Memcached biedt geen native ondersteuning voor Streams, maar er zijn open source bibliotheektools zoals Kafcache voor streamverwerking met lage latentie.

Georuimtelijke ondersteuning

Redis heeft een gegevensstructuur genaamd Geospatial indexen die de lengte- en breedtegraadgegevens van een locatie opslaat. U kunt verschillende bewerkingen uitvoeren op de geospatiale gegevens, zoals het berekenen van de afstand tussen twee punten of het vinden van nabijgelegen plaatsen.

Memcached heeft geen speciale datastructuren om geospatiale data te verwerken.

Prestaties

Een prestatievergelijking tussen in-memory key-value datastores is meer een intellectuele oefening dan van enig praktisch belang - tenzij u systemen op zo'n schaal implementeert dat dit interessant wordt als een kostenbesparende maatregel. Dit komt omdat dergelijke winkels IO-gebonden zijn en meestal kan de netwerklatentie een grotere rol spelen bij de door de applicatie waargenomen latentie dan de databaselatentie.

Een praktischer prestatieaspect is opslagefficiëntie - hoeveel gegevens kunnen worden verpakt in dezelfde hoeveelheid geheugen. Zelfs hier variëren de interne gegevensstructuren die door Redis worden gebruikt, op basis van de gegevensgrootte. Dus elke discussie over prestaties tussen deze databases moet met een korreltje zout worden genomen.

Laten we eens kijken naar enkele vergelijkingen die in een onderzoekspaper uit 2016 werden getoond. In dit artikel experimenteren de auteurs met de veelgebruikte in-memory databases om hun prestaties te meten in termen van:

  1. De tijd die nodig is om bewerkingen te voltooien.
  2. Hoe efficiënt ze geheugen gebruiken tijdens operaties.

Databaseversies gebruikt in de krant:

Database Versie
Redis 3.0.7
Memcached 1.4.14

Schrijfbewerking

Tijdens het schrijven van gegevens, zoals je kunt zien, vertoont Memcached in de onderstaande tabel een uitzonderlijke snelheid, zelfs nadat het aantal records oploopt tot miljoen.

De berekende tijd om sleutel-waardeparen te schrijven (ms)

Aantal records
Database 1.000 10,000 100.000 1.000.000
Redis 34 214 1.666 14,638
Memcached 23 100 276 2.813

Bewerking lezen

Het lezen van gegevens blijft bijna consistent in Redis, zelfs voor een miljoen records, maar in Memcached neemt de tijd ook een beetje toe naarmate het aantal records toeneemt.

De verstreken tijd om de waarde te lezen die overeenkomt met een bepaalde sleutel per database (ms)

Aantal records
Database 1.000 10,000 100.000 1.000.000
Redis 8 6 8 8
Memcached 9 14 14 30

Geheugengebruik

Terwijl we het over geheugengebruik hebben, is Redis altijd de beste, zoals je kunt zien in de resultaten.

Geheugengebruik van in-memory databases voor schrijfbewerkingen (MB)

Aantal records
Database 1.000 10,000 100.000 1.000.000
Redis 2,5 3.8 4.3 62,7
Memcached 5.3 27,2 211 264.9

Zoals je kunt zien is Redis beter dan Memcached.

Geheugengebruik van in-memory databases voor wisbewerking (MB)

Aantal records
Database 1.000 10,000 100.000 1.000.000
Redis 0 0 0 0
Memcached 2.2 2.1 2.2 2.2

Beheerde services/ondersteuning

De grotere populariteit en community voor Redis heeft ook geleid tot de behoefte aan beheerde services, hosting en ondersteuning. Populaire aanbieders van beheerde databases voor Redis™* zijn ScaleGrid, Redis Labs, AWS Elasticache, Azure Cache en DigitalOcean. Deze pagina biedt een geweldige vergelijking van de topaanbieders voor Redis™. Redis heeft ook uitgebreide interne rapportagetools zoals cachehits, geheugengebruik, ops en zelfs een langzame geregistreerde zoekopdracht.

Beheerde services voor Memcached zijn veel minder beschikbaar, maar worden nog steeds ondersteund via Amazon Elasticache.

Ondersteuning voor Transport Layer Security (TLS)

Redis heeft native TLS-ondersteuning vanaf Redis 6.0. Eerdere versies van Redis adviseerden het gebruik van stunnel voor het bieden van TLS-ondersteuning.

Memcached 1.5.13 en hoger versies ondersteunen authenticatie en encryptie via TLS. Deze functie bevindt zich nog in de experimentele fase.

Verificatie

Tot aan Redis 5.x ondersteunde Redis alleen een eenvoudige authenticatie op basis van een wachtwoord. Dit wachtwoord werd in platte tekst op de server opgeslagen. Redis vanaf versie 6.0 ondersteunt een volledig uitgeruste ACL.

Memcached versie 1.4.3 en hoger heeft SASL-ondersteuning. Voorheen had Memcached geen authenticatielaag.

Samenvatting

Redis en Memcached zijn beide geweldig en hebben toepassingen op verschillende gebieden. Redis dat later wordt ontwikkeld, heeft veel geavanceerde functionaliteiten en heeft geweldige documentatie en community.

Geïnteresseerd in meer informatie over ScaleGrid?

Voor meer informatie over hoe ScaleGrid Hosting voor Redis™* u kan helpen bij het beheren van uw databases, bekijk onze ScaleGrid Service voor Redis™-pagina. Bekijk hoe u met ScaleGrid-hosting voor Redis™ u meer kunt focussen op het ontwikkelen van uw product en minder op het beheren van databases.

*Redis is een handelsmerk van Redis Labs Ltd. Alle rechten daarin zijn voorbehouden aan Redis Labs Ltd. Elk gebruik door ScaleGrid is alleen voor referentiedoeleinden en duidt niet op sponsoring, goedkeuring of samenwerking tussen Redis en ScaleGrid.


  1. MongoDB findOneAndUpdate()

  2. De meest efficiënte manier om meerdere hashes in Redis te krijgen?

  3. Mongoose - veroorzaakt door ::11000 E11000 dubbele sleutelfoutindex?

  4. Installeer MongoDB op een Mac