sql >> Database >  >> NoSQL >> Redis

Memcached versus Redis?

Samenvatting (TL;DR)

Bijgewerkt op 3 juni 2017

Redis is krachtiger, populairder en beter ondersteund dan memcached. Memcached kan maar een klein deel van de dingen die Redis kan doen. Redis is beter, zelfs als hun functies elkaar overlappen.

Gebruik Redis voor iets nieuws.

Memcached vs Redis:directe vergelijking

Beide tools zijn krachtige, snelle gegevensopslag in het geheugen die handig zijn als cache. Beide kunnen u helpen uw toepassing te versnellen door databaseresultaten, HTML-fragmenten of iets anders dat mogelijk duur is om te genereren in de cache op te slaan.

Aandachtspunten

Als ze voor hetzelfde worden gebruikt, is dit hoe ze zich verhouden met behulp van de "Aandachtspunten" van de oorspronkelijke vraag:

  • Lees-/schrijfsnelheid :Beide zijn extreem snel. Benchmarks variëren per workload, versies en vele andere factoren, maar over het algemeen blijkt redis net zo snel of bijna net zo snel te zijn als memcached. Ik raad redis aan, maar niet omdat memcached traag is. Dat is het niet.
  • Geheugengebruik :Redis is beter.
    • memcached:je specificeert de cachegrootte en als je items invoegt, groeit de daemon snel tot iets meer dan deze grootte. Er is nooit echt een manier om die ruimte terug te winnen, behalve het herstarten van memcached. Al je sleutels kunnen verlopen zijn, je zou de database kunnen leegmaken en het zou nog steeds het volledige stuk RAM gebruiken waarmee je het hebt geconfigureerd.
    • redis:het instellen van een maximale grootte is aan jou. Redis gebruikt nooit meer dan nodig is en geeft je geheugen terug dat het niet meer gebruikt.
    • Ik heb 100.000 ~2KB strings (~200MB) willekeurige zinnen in beide opgeslagen. Het gebruik van Memcached RAM groeide tot ~ 225 MB. Redis RAM-gebruik groeide tot ~ 228 MB. Na beide te hebben doorgespoeld, zakte redis naar ~ 29 MB en bleef memcached op ~ 225 MB. Ze zijn even efficiënt in de manier waarop ze gegevens opslaan, maar er is er maar één die deze kan terugvorderen.
  • Schijf-I/O-dumping :Een duidelijke overwinning voor redis omdat het dit standaard doet en zeer configureerbare persistentie heeft. Memcached heeft geen mechanismen om naar schijf te dumpen zonder tools van derden.
  • Schaal :Beide geven je veel hoofdruimte voordat je meer dan een enkele instantie als cache nodig hebt. Redis bevat tools waarmee je verder kunt gaan, terwijl memcached dat niet doet.

memcached

Memcached is een eenvoudige vluchtige cacheserver. Hiermee kunt u sleutel/waarde-paren opslaan waarvan de waarde beperkt is tot een reeks van maximaal 1 MB.

Het is goed in dit, maar dat is alles wat het doet. Je hebt toegang tot die waarden via hun sleutel met extreem hoge snelheid, vaak verzadigend beschikbare netwerk- of zelfs geheugenbandbreedte.

Wanneer u memcached opnieuw start, zijn uw gegevens verdwenen. Dit is prima voor een cache. Je moet daar niets belangrijks bewaren.

Als u hoge prestaties of hoge beschikbaarheid nodig heeft, zijn er tools, producten en services van derden beschikbaar.

opnieuw

Redis kan hetzelfde werk doen als memcached, en kan ze beter.

Redis kan ook als cache fungeren. Het kan ook sleutel/waarde-paren opslaan. In redis kunnen ze zelfs tot 512 MB groot zijn.

U kunt persistentie uitschakelen en het zal ook graag uw gegevens verliezen bij het opnieuw opstarten. Als u wilt dat uw cache het opnieuw opstarten overleeft, kunt u dat ook doen. In feite is dat de standaardinstelling.

Het is ook supersnel, vaak beperkt door netwerk- of geheugenbandbreedte.

Als één exemplaar van redis/memcached niet voldoende is voor uw werklast, is redis de duidelijke keuze. Redis bevat clusterondersteuning en wordt geleverd met tools voor hoge beschikbaarheid (redis-sentinel) direct "in the box". In de afgelopen jaren heeft redis zich ook ontpopt als de duidelijke leider in tooling van derden. Bedrijven zoals Redis Labs, Amazon en anderen bieden veel handige redis-tools en -services. Het ecosysteem rond redis is veel groter. Het aantal grootschalige implementaties is nu waarschijnlijk groter dan voor memcached.

De Redis Superset

Redis is meer dan een cache. Het is een in-memory datastructuurserver. Hieronder vindt u een snel overzicht van dingen die Redis kan doen naast een eenvoudige sleutel/waarde-cache zoals memcached. Meeste van de functies van redis zijn dingen die memcached niet kan doen.

Documentatie

Redis is beter gedocumenteerd dan memcached. Hoewel dit subjectief kan zijn, lijkt het steeds meer waar te zijn.

redis.io is een fantastische, gemakkelijk te navigeren bron. Hiermee kunt u redis in de browser proberen en krijgt u zelfs live interactieve voorbeelden met elke opdracht in de documenten.

Er zijn nu 2x zoveel stackoverflow-resultaten voor redis als memcached. 2x zoveel Google-resultaten. Gemakkelijker toegankelijke voorbeelden in meer talen. Meer actieve ontwikkeling. Actievere klantontwikkeling. Deze metingen kunnen afzonderlijk misschien niet veel betekenen, maar in combinatie geven ze een duidelijk beeld dat de ondersteuning en documentatie voor redis groter en veel actueler is.

Persistentie

Standaard bewaart redis uw gegevens op schijf met behulp van een mechanisme dat snapshotting wordt genoemd. Als je genoeg RAM beschikbaar hebt, kan het al je gegevens naar schijf schrijven met bijna geen prestatievermindering. Het is bijna gratis!

In de snapshot-modus bestaat de kans dat een plotselinge crash kan resulteren in een kleine hoeveelheid gegevensverlies. Als u er absoluut zeker van wilt zijn dat er nooit gegevens verloren gaan, hoeft u zich geen zorgen te maken, redis staat ook voor u klaar met de AOF-modus (Append Only File). In deze persistentiemodus kunnen gegevens naar de schijf worden gesynchroniseerd terwijl ze worden geschreven. Dit kan de maximale schrijfsnelheid verminderen tot hoe snel uw schijf ook kan schrijven, maar het zou nog steeds behoorlijk snel moeten zijn.

Er zijn veel configuratie-opties om de persistentie te verfijnen als dat nodig is, maar de standaardinstellingen zijn zeer verstandig. Deze opties maken het gemakkelijk om Redis in te stellen als een veilige, redundante plek om gegevens op te slaan. Het is een echte database.

Veel gegevenstypen

Memcached is beperkt tot strings, maar Redis is een datastructuurserver die veel verschillende datatypes kan bieden. Het biedt ook de commando's die u nodig hebt om het meeste uit deze gegevenstypen te halen.

Tekenreeksen (commando's)

Eenvoudige tekst of binaire waarden die maximaal 512 MB groot kunnen zijn. Dit is het enige datatype voor redis en memcached share, hoewel memcached strings beperkt zijn tot 1 MB.

Redis geeft je meer tools om gebruik te maken van dit datatype door opdrachten aan te bieden voor bitsgewijze bewerkingen, manipulatie op bitniveau, drijvende-komma verhogen/verlagen ondersteuning, bereikquery's en bewerkingen met meerdere toetsen. Memcached ondersteunt dat allemaal niet.

Strings zijn handig voor allerlei gebruiksscenario's, daarom is memcached redelijk nuttig met alleen dit gegevenstype.

Hashes (commando's)

Hashes zijn een soort sleutelwaardeopslag binnen een sleutelwaardeopslag. Ze verwijzen tussen tekenreeksvelden en tekenreekswaarden. Veld->waardekaarten die een hash gebruiken, zijn iets meer ruimtebesparend dan sleutel->waardekaarten die gewone tekenreeksen gebruiken.

Hashes zijn handig als naamruimte of wanneer u veel sleutels logisch wilt groeperen. Met een hash kun je alle leden efficiënt pakken, alle leden samen laten verlopen, alle leden samen verwijderen, enz. Geweldig voor elk gebruik waarbij je verschillende sleutel/waarde-paren hebt die moeten worden gegroepeerd.

Een voorbeeld van het gebruik van een hash is voor het opslaan van gebruikersprofielen tussen applicaties. Met een redis-hash die is opgeslagen met de gebruikers-ID als sleutel, kunt u zoveel gegevens over een gebruiker opslaan als nodig is, terwijl ze onder één enkele sleutel worden bewaard. Het voordeel van het gebruik van een hash in plaats van het profiel in een string te serialiseren, is dat u verschillende toepassingen verschillende velden in het gebruikersprofiel kunt laten lezen/schrijven zonder dat u zich zorgen hoeft te maken dat de ene app wijzigingen door anderen overschrijft (wat kan gebeuren als u verouderde gegevens).

Lijsten (commando's)

Redis-lijsten zijn geordende verzamelingen tekenreeksen. Ze zijn geoptimaliseerd voor het invoegen, lezen of verwijderen van waarden aan de boven- of onderkant (ook wel:links of rechts) van de lijst.

Redis biedt veel commando's voor het gebruik van lijsten, waaronder commando's om items te pushen/poppen, pushen/poppen tussen lijsten, lijsten afkappen, bereikquery's uitvoeren, enz.

Lijsten vormen geweldige, atomaire wachtrijen. Deze werken uitstekend voor taakwachtrijen, logboeken, buffers en vele andere gebruiksscenario's.

Sets (commando's)

Sets zijn ongeordende verzamelingen van unieke waarden. Ze zijn geoptimaliseerd zodat u snel kunt controleren of een waarde in de set zit, snel waarden kunt toevoegen/verwijderen en overlap met andere sets kunt meten.

Deze zijn geweldig voor zaken als toegangscontrolelijsten, unieke bezoekerstrackers en vele andere dingen. De meeste programmeertalen hebben iets soortgelijks (meestal een set genoemd). Dit is zo, alleen gedistribueerd.

Redis biedt verschillende opdrachten om sets te beheren. Voor de hand liggende zoals het toevoegen, verwijderen en controleren van de set zijn aanwezig. Dat geldt ook voor minder voor de hand liggende commando's, zoals een willekeurig item laten knallen/lezen en commando's voor het uitvoeren van vakbonden en intersecties met andere sets.

Gesorteerde sets (commando's)

Gesorteerde sets zijn ook verzamelingen van unieke waarden. Deze zijn, zoals de naam al aangeeft, geordend. Ze zijn geordend op partituur en vervolgens lexicografisch.

Dit gegevenstype is geoptimaliseerd voor snel opzoeken op score. Het verkrijgen van de hoogste, laagste of een reeks tussenliggende waarden is extreem snel.

Als je gebruikers aan een gesorteerde set toevoegt, samen met hun hoogste score, heb je een perfect leaderboard. Als er nieuwe highscores binnenkomen, voeg je ze gewoon opnieuw toe aan de set met hun highscore en het zal je leaderboard opnieuw ordenen. Ook geweldig om bij te houden wanneer gebruikers voor het laatst een bezoek hebben gebracht en wie er actief is in uw applicatie.

Door waarden met dezelfde score op te slaan, worden ze lexicografisch geordend (denk alfabetisch). Dit kan handig zijn voor zaken als functies voor automatisch aanvullen.

Veel van de gesorteerde set-opdrachten zijn vergelijkbaar met opdrachten voor sets, soms met een extra scoreparameter. Ook inbegrepen zijn commando's voor het beheren van scores en het zoeken op score.

Geo

Redis heeft verschillende opdrachten voor het opslaan, ophalen en meten van geografische gegevens. Dit omvat radiusvragen en het meten van afstanden tussen punten.

Technisch gezien worden geografische gegevens in redis opgeslagen in gesorteerde sets, dus dit is geen echt afzonderlijk gegevenstype. Het is meer een uitbreiding bovenop gesorteerde sets.

Bitmap en HyperLogLog

Net als geo zijn dit geen volledig afzonderlijke gegevenstypen. Dit zijn opdrachten waarmee u tekenreeksgegevens kunt behandelen alsof het een bitmap of een hyperloglog is.

Bitmaps zijn de operators op bitniveau waarnaar ik verwees onder Strings zijn voor. Dit gegevenstype was de basisbouwsteen voor het recente gezamenlijke kunstproject van reddit:r/Place.

Met HyperLogLog kunt u een constant extreem kleine hoeveelheid ruimte gebruiken om bijna onbeperkte unieke waarden te tellen met schokkende nauwkeurigheid. Met slechts ~16 KB kunt u efficiënt het aantal unieke bezoekers van uw site tellen, zelfs als dat aantal in de miljoenen loopt.

Transacties en atoomkracht

Commando's in redis zijn atomair, wat betekent dat u er zeker van kunt zijn dat zodra u een waarde naar redis schrijft, die waarde zichtbaar is voor alle clients die op redis zijn aangesloten. U hoeft niet te wachten tot die waarde zich verspreidt. Technisch gezien is memcached ook atomair, maar met redis die al deze functionaliteit naast memcached toevoegt, is het vermeldenswaard en enigszins indrukwekkend dat al deze aanvullende gegevenstypen en functies ook atomair zijn.

Hoewel niet helemaal hetzelfde als transacties in relationele databases, heeft redis ook transacties die gebruikmaken van "optimistische vergrendeling" (WATCH/MULTI/EXEC).

Pijpvoering

Redis biedt een functie genaamd 'pipelining'. Als je veel redis-commando's hebt die je wilt uitvoeren, kun je pipelining gebruiken om ze allemaal tegelijk naar redis te sturen in plaats van één voor één.

Normaal gesproken is elke opdracht een afzonderlijke verzoek-/antwoordcyclus wanneer u een opdracht uitvoert naar redis of memcached. Met pipelining kan redis verschillende commando's bufferen en ze allemaal tegelijk uitvoeren, waarbij alle reacties op al je commando's in één antwoord worden beantwoord.

Hierdoor kunt u een nog grotere doorvoer bereiken bij bulkimport of andere acties waarbij veel opdrachten nodig zijn.

Pub/Sub

Redis heeft commando's voor pub/sub-functionaliteit, waardoor redis kan fungeren als een snelle berichtuitzender. Hierdoor kan een enkele client berichten publiceren naar vele andere clients die op een kanaal zijn aangesloten.

Redis doet pub/sub evenals bijna elke tool. Toegewijde berichtenmakelaars zoals RabbitMQ kunnen op bepaalde gebieden voordelen hebben, maar het feit dat dezelfde server u ook aanhoudende, duurzame wachtrijen en andere gegevensstructuren kan geven die uw pub/sub-workloads waarschijnlijk nodig hebben, zal Redis vaak de beste en meest eenvoudige tool blijken te zijn. voor de baan.

Lua-scripts

Je kunt een beetje denken aan lua-scripts zoals Redis' eigen SQL of opgeslagen procedures. Het is zowel meer als minder dan dat, maar de analogie werkt meestal.

Misschien heeft u complexe berekeningen die u redis wilt laten uitvoeren. Misschien kunt u het zich niet veroorloven om uw transacties terug te draaien en heeft u garanties nodig dat elke stap van een complex proces atomair zal plaatsvinden. Deze problemen en nog veel meer kunnen worden opgelost met lua-scripting.

Het hele script wordt atomair uitgevoerd, dus als je je logica in een lua-script kunt passen, kun je vaak voorkomen dat je knoeit met optimistische vergrendelingstransacties.

Schaal

Zoals hierboven vermeld, bevat redis ingebouwde ondersteuning voor clustering en wordt het gebundeld met zijn eigen tool voor hoge beschikbaarheid genaamd redis-sentinel .

Conclusie

Zonder aarzeling zou ik aanraden om opnieuw te gebruiken via memcached voor nieuwe projecten, of bestaande projecten die nog geen gebruik maken van memcached.

Het bovenstaande klinkt misschien alsof ik niet van memcached houd. Integendeel:het is een krachtig, eenvoudig, stabiel, volwassen en gehard stuk gereedschap. Er zijn zelfs gevallen waarin het iets sneller is dan redis. Ik hou van memcaches. Ik denk gewoon niet dat het veel zin heeft voor toekomstige ontwikkeling.

Redis doet alles wat memcached doet, vaak beter. Elk prestatievoordeel voor memcached is klein en specifiek voor de werkbelasting. Er zijn ook workloads waarvoor redis sneller zal zijn, en veel meer workloads die redis kan doen en memcached gewoon niet. De kleine prestatieverschillen lijken klein in het licht van de gigantische kloof in functionaliteit en het feit dat beide tools zo snel en efficiënt zijn dat ze wel eens het laatste onderdeel van je infrastructuur kunnen zijn waar je je ooit zorgen over hoeft te maken.

Er is maar één scenario waarin memcached logischer is:waar memcached al in gebruik is als cache. Als je al aan het cachen bent met memcached, blijf het dan gebruiken als het aan je behoeften voldoet. Het is waarschijnlijk niet de moeite waard om naar redis te gaan en als je redis alleen voor caching gaat gebruiken, biedt het misschien niet genoeg voordeel om je tijd waard te zijn. Als memcached niet aan uw behoeften voldoet, moet u waarschijnlijk naar redis gaan. Dit is waar, of je nu verder wilt schalen dan memcached of dat je extra functionaliteit nodig hebt.



  1. Memcached installeren op Ubuntu 16.04/18.04 met Nginx en PHP-7.3

  2. Een MongoDB-instantie of replicaset klonen

  3. Mongodb Aggregation Framework:gebruikt $group index?

  4. MongoDB $not Aggregation Pipeline Operator