Waarom Redis Memcached verslaat voor caching

Memcached of Redis? Het is een vraag die bijna altijd opkomt in elke discussie over het persen van meer prestaties uit een moderne, databasegestuurde webapplicatie. Wanneer de prestaties moeten worden verbeterd, is caching vaak de eerste stap die wordt genomen, en Memcached of Redis zijn meestal de eerste plaatsen om te draaien.

Deze gerenommeerde cache-engines hebben een aantal overeenkomsten, maar ze hebben ook belangrijke verschillen. Redis, de nieuwere en veelzijdiger van de twee, is bijna altijd de beste keuze.

Redis vs. Memcached voor caching

Laten we beginnen met de overeenkomsten. Zowel Memcached als Redis dienen als in-memory, key-value data-opslag, hoewel Redis nauwkeuriger wordt omschreven als een datastructuuropslag. Zowel Memcached als Redis behoren tot de NoSQL-familie van datamanagementoplossingen, en beide zijn gebaseerd op een key-value datamodel. Ze bewaren allebei alle gegevens in het RAM, waardoor ze natuurlijk uitermate nuttig zijn als caching-laag. In termen van prestaties zijn de twee datastores ook opmerkelijk vergelijkbaar, en vertonen ze bijna identieke kenmerken (en statistieken) met betrekking tot doorvoer en latentie.

Zowel Memcached als Redis zijn volwassen en enorm populaire open source-projecten. Memcached is oorspronkelijk ontwikkeld door Brad Fitzpatrick in 2003 voor de LiveJournal-website. Sindsdien is Memcached herschreven in C (de oorspronkelijke implementatie was in Perl) en in het publieke domein geplaatst, waar het een hoeksteen is geworden van moderne webapplicaties. De huidige ontwikkeling van Memcached is gericht op stabiliteit en optimalisaties in plaats van nieuwe functies toe te voegen.

Redis is in 2009 opgericht door Salvatore Sanfilippo en Sanfilippo is nog steeds de hoofdontwikkelaar van het project. Redis wordt soms omschreven als "Memcached op steroïden", wat niet verwonderlijk is gezien het feit dat delen van Redis zijn gebouwd als reactie op lessen die zijn geleerd bij het gebruik van Memcached. Redis heeft meer functies dan Memcached en is dus krachtiger en flexibeler.

Zowel Memcached als Redis worden door veel bedrijven en in talloze bedrijfskritische productieomgevingen gebruikt en worden ondersteund door clientbibliotheken in elke denkbare programmeertaal, en het is opgenomen in een groot aantal pakketten voor ontwikkelaars. In feite is het een zeldzame webstack die geen ingebouwde ondersteuning voor Memcached of Redis bevat.

Waarom zijn Memcached en Redis zo populair? Ze zijn niet alleen buitengewoon effectief, ze zijn ook relatief eenvoudig. Aan de slag gaan met Memcached of Redis wordt als gemakkelijk werk beschouwd voor een ontwikkelaar. Het duurt slechts een paar minuten om ze op te zetten en ze aan het werk te krijgen met een applicatie. Een kleine investering in tijd en moeite kan dus een onmiddellijke, dramatische impact hebben op de prestaties, meestal in grootteorden. Een simpele oplossing met een enorm voordeel; dat is zo dicht bij magie als je kunt krijgen.

Wanneer Memcached gebruiken

Memcached kan de voorkeur hebben bij het cachen van relatief kleine en statische gegevens, zoals HTML-codefragmenten. Het interne geheugenbeheer van Memcached, hoewel niet zo geavanceerd als dat van Redis, is efficiënter in de eenvoudigste gevallen omdat het relatief minder geheugenbronnen voor metadata verbruikt. Strings (het enige datatype dat door Memcached wordt ondersteund) zijn ideaal voor het opslaan van gegevens die alleen worden gelezen, omdat strings geen verdere verwerking nodig hebben.

Bij grote gegevenssets zijn vaak geserialiseerde gegevens betrokken, die altijd meer opslagruimte vereisen. Hoewel Memcached in feite beperkt is tot het opslaan van gegevens in zijn geserialiseerde vorm, kunnen de datastructuren in Redis elk aspect van de gegevens native opslaan, waardoor de overhead voor serialisatie wordt verminderd.

Het tweede scenario waarin Memcached een voordeel heeft ten opzichte van Redis, is schaalvergroting. Omdat Memcached multithreaded is, kun je gemakkelijk opschalen door het meer rekenkracht te geven, maar je verliest een deel of alle cachegegevens (afhankelijk van of je consistente hashing gebruikt). Redis, dat meestal single-threaded is, kan horizontaal worden geschaald via clustering zonder gegevensverlies. Clustering is een effectieve schaaloplossing, maar is relatief complexer om op te zetten en te bedienen.

Wanneer u Redis moet gebruiken

U zult Redis bijna altijd willen gebruiken vanwege de datastructuren. Met Redis als cache krijgt u veel kracht (zoals de mogelijkheid om cache-inhoud en duurzaamheid te verfijnen) en een grotere efficiëntie in het algemeen. Zodra u de datastructuren gebruikt, wordt de efficiëntie-boost enorm voor specifieke toepassingsscenario's.

De superioriteit van Redis is duidelijk in bijna elk aspect van cachebeheer. Caches gebruiken een mechanisme dat gegevensverwijdering wordt genoemd om ruimte te maken voor nieuwe gegevens door oude gegevens uit het geheugen te verwijderen. Het gegevensverwijderingsmechanisme van Memcached maakt gebruik van een minst recent gebruikt algoritme en verwijdert enigszins willekeurig gegevens die qua grootte vergelijkbaar zijn met de nieuwe gegevens.

Redis biedt daarentegen een fijnmazige controle over uitzetting, waardoor u kunt kiezen uit zes verschillende uitzettingsbeleidslijnen. Redis maakt ook gebruik van meer geavanceerde benaderingen van geheugenbeheer en selectie van kandidaten voor uitzetting. Redis ondersteunt zowel luie als actieve uitzetting, waarbij gegevens alleen worden verwijderd als er meer ruimte nodig is of proactief. 

Redis geeft u veel meer flexibiliteit met betrekking tot de objecten die u kunt cachen. Terwijl Memcached sleutelnamen beperkt tot 250 bytes en alleen werkt met gewone strings, staat Redis toe dat sleutelnamen en waarden zo groot zijn als 512 MB elk, en ze zijn binair veilig. Bovendien heeft Redis vijf primaire datastructuren om uit te kiezen, waardoor een wereld van mogelijkheden voor de applicatieontwikkelaar wordt geopend door intelligente caching en manipulatie van cachegegevens.

Redis voor gegevenspersistentie

Het gebruik van Redis-datastructuren kan verschillende taken vereenvoudigen en optimaliseren, niet alleen tijdens caching, maar zelfs wanneer u wilt dat de gegevens permanent en altijd beschikbaar zijn. In plaats van objecten op te slaan als geserialiseerde tekenreeksen, kunnen ontwikkelaars bijvoorbeeld een Redis-hash gebruiken om de velden en waarden van een object op te slaan en deze met één sleutel te beheren. Redis Hash bespaart ontwikkelaars de noodzaak om de hele string op te halen, te deserialiseren, een waarde bij te werken, het object opnieuw te serialiseren en de hele string in de cache te vervangen door zijn nieuwe waarde voor elke triviale update - dat betekent een lager resourceverbruik en betere prestaties.

Andere datastructuren die door Redis worden aangeboden (zoals lijsten, sets, gesorteerde sets, hyperloglogs, bitmaps en geospatiale indexen) kunnen worden gebruikt om nog complexere scenario's te implementeren. Gesorteerde sets voor het opnemen en analyseren van tijdreeksen zijn een ander voorbeeld van een Redis-datastructuur die enorm minder complexiteit en een lager bandbreedteverbruik biedt.

Een ander belangrijk voordeel van Redis is dat de gegevens die het opslaat niet ondoorzichtig zijn, zodat de server deze direct kan manipuleren. Een aanzienlijk deel van de meer dan 180 opdrachten die beschikbaar zijn in Redis, wordt besteed aan gegevensverwerkingsoperaties en het inbedden van logica in de gegevensopslag zelf via Lua-scripting aan de serverzijde. Deze ingebouwde opdrachten en gebruikersscripts geven u de flexibiliteit om gegevensverwerkingstaken rechtstreeks in Redis af te handelen zonder dat u gegevens over het netwerk naar een ander systeem hoeft te verzenden voor verwerking.

Redis biedt optionele en instelbare gegevenspersistentie, ontworpen om de cache op te starten na een geplande uitschakeling of een ongeplande storing. Hoewel we de gegevens in caches meestal als vluchtig en tijdelijk beschouwen, kan het bewaren van gegevens op schijf behoorlijk waardevol zijn in cachescenario's. Als de cachegegevens beschikbaar zijn om onmiddellijk na het opnieuw opstarten te laden, kan de cache veel sneller worden opgewarmd en wordt de belasting van het opnieuw vullen en herberekenen van cachegeheugen uit de primaire gegevensopslag verwijderd.

Redis in-memory datareplicatie 

Redis kan ook de gegevens repliceren die het beheert. Replicatie kan worden gebruikt voor het implementeren van een cache-installatie met hoge beschikbaarheid die bestand is tegen storingen en ononderbroken service aan de toepassing biedt. Een cachefout is qua impact op de gebruikerservaring en applicatieprestaties slechts een klein beetje lager dan een applicatiefout, dus het hebben van een bewezen oplossing die de inhoud van de cache en de beschikbaarheid van services garandeert, is in de meeste gevallen een groot voordeel.

Last but not least, in termen van operationele zichtbaarheid, biedt Redis een hele reeks statistieken en een schat aan introspectieve commando's waarmee het gebruik en abnormaal gedrag kan worden gevolgd en gevolgd. Real-time statistieken over elk aspect van de database, de weergave van alle opdrachten die worden uitgevoerd, de lijst en het beheer van clientverbindingen - Redis heeft dat allemaal en meer.

Wanneer ontwikkelaars de effectiviteit van Redis 'persistentie en replicatiemogelijkheden in het geheugen beseffen, gebruiken ze deze vaak als een eerstehulpdatabase, meestal om gegevens met hoge snelheid te analyseren en te verwerken en om de gebruiker te antwoorden, terwijl een secundaire (vaak langzamere) database onderhoudt een historisch verslag van wat er is gebeurd. Bij gebruik op deze manier kan Redis ook ideaal zijn voor gebruiksscenario's voor analyses.

Redis voor data-analyse

Drie analytische scenario's komen meteen in me op. In het eerste scenario kunt u, wanneer u iets als Apache Spark gebruikt om iteratief grote gegevenssets te verwerken, Redis gebruiken als een presentatielaag voor gegevens die eerder door Spark zijn berekend. In het tweede scenario kan het gebruik van Redis als uw gedeelde, in-memory, gedistribueerde gegevensopslag de Spark-verwerkingssnelheden met een factor 45 tot 100 versnellen. Ten slotte is een al te vaak voorkomend scenario een scenario waarin rapporten en analyses moeten worden aangepast door de gebruiker, maar het ophalen van gegevens uit inherent batchgegevensopslag (zoals Hadoop of een RDBMS) duurt te lang. In dit geval is een datastructuuropslag in het geheugen zoals Redis de enige praktische manier om paging- en responstijden van minder dan een milliseconde te verkrijgen.

Bij het gebruik van extreem grote operationele gegevenssets of analyse-workloads is het mogelijk niet kosteneffectief om alles in het geheugen uit te voeren. Om prestaties van minder dan een milliseconde tegen lagere kosten te bereiken, heeft Redis Labs een versie van Redis gemaakt die werkt op een combinatie van RAM en flash, met de optie om RAM-naar-flash-verhoudingen te configureren. Hoewel dit verschillende nieuwe wegen opent om de verwerking van werkbelasting te versnellen, biedt het ontwikkelaars ook de mogelijkheid om gewoon hun "cache op flash" uit te voeren.

Open source-software biedt nog steeds enkele van de beste technologieën die momenteel beschikbaar zijn. Als het gaat om het verbeteren van de applicatieprestaties door middel van caching, zijn Redis en Memcached de meest gevestigde en in productie bewezen kandidaten. Maar gezien de rijkere functionaliteit, het geavanceerdere ontwerp, de vele mogelijke toepassingen en de grotere kostenefficiëntie van Redis op schaal, zou Redis in bijna alle gevallen uw eerste keuze moeten zijn.

---

Itamar Haber (@itamarhaber) is hoofdontwikkelaaradvocaat bij Redis Labs, dat Memcached en Redis aanbiedt als volledig beheerde clouddiensten voor ontwikkelaars. Zijn gevarieerde ervaring omvat ontwikkeling van softwareproducten en management- en leiderschapsrollen bij Xeround, Etagon, Amicada en MNS Ltd. Itamar heeft een Master of Business Administration behaald aan het gezamenlijke Kellogg-Recanati-programma van de universiteiten van Northwestern en Tel-Aviv, evenals een Bachelor of Science in Computer Science.

New Tech Forum biedt een locatie om opkomende bedrijfstechnologie in ongekende diepte en breedte te verkennen en te bespreken. De selectie is subjectief, gebaseerd op onze keuze van de technologieën die wij belangrijk vinden en het meest interessant zijn voor lezers. accepteert geen marketingmateriaal voor publicatie en behoudt zich het recht voor om alle bijgedragen inhoud te bewerken. Stuur alle vragen naar [email protected]