Voor ontwikkelaars zal de term ‘Memcached‘ geen onbekende meer zijn. Voor velen is het al een standaard onderdeel van hun applicatie. Voor wie memcached nog niet kent of er nog nooit mee gewerkt heeft lichten we in deze blogpost verder toe wat memcached doet, waar je het best memcached kan gebruiken en waarom.

Wat is memcached?

Memcached noemt zichzelf een ‘distributed memory object caching system‘. Dat zit natuurlijk voor een stuk ook al in de naam van de tool, Memory Cache of Memcache. Memcached is een service die draait op een server, net als een webserver als Apache of Nginx of een MySQL server zou draaien. Het idee achter memcached is dat je een érg snelle key/value opslag manier hebt om ‘wegwerp’ data in bij te houden. Belangrijk om weten is dat dit geen persistente opslag is. Het wordt niet gebruikt ter vervanging van de data-opslag van bv. je database, het vult dit systeem enkel aan. Alle data in memcached is vluchtig. Bij een herstart van de memcached service vervalt alle data en krijg je opnieuw een lege ‘memory cache’. Waarom zou dat handig zijn? Neem bv. een PHP web applicatie als voorbeeld. Op een drukke website, zoals een nieuws-site, komen veel bezoekers die steeds dezelfde data ophalen. Een homepage met nieuws-items, auteur info en het aantal commentaren op zo’n nieuwsbericht kan een complexe query worden om te berekeken. Meerdere JOIN’s, veel data, … Nochtans is dat voor elke bezoeker op de website quasi dezelfde informatie. Het idee achter memcached is dat je de resultaten van zware operaties, zoals het ophalen van nieuws-items, het ophalen van commentaren, het berekenen van calculaties, … in het geheugen van je server kan bijhouden om er later beroep op te kunnen doen en niet steeds opnieuw de database moet belasten voor zulke informatie. Memcached heeft zo dus gelijkenissen met bv. Varnish (lees: Wat is Varnish en wat heb ik er aan?) omdat ze op een gelijkaardige manier een cache beheren. De redenering van een memcached implementatie is als volgt:

  1. een bezoeker roept een pagina op, bv. website.be/nieuws-berichten
  2. de PHP code zal eerst kijken of de informatie die getoond moet worden in memcached zit
  3. als de informatie niet in memcached zit wordt een query uitgevoerd om de database te raadplegen
  4. eens de informatie opgevraagd is slaat de PHP code een kopie van die uitvoer op in memcached
  5. de pagina wordt getoond aan de gebruiker

memcached_request_flow Voor de eerste bezoeker aan de website zal dus een query gebruikt worden om de informatie uit een database op te vragen. Die info schrijven we bij het ophalen uit de database ook weg naar de memcached server. De volgende bezoeker aan de site heeft het voordeel dat die niet moet wachten op een query van de database, maar dat de informatie uit memcached al gebruikt kan worden. Dit spaart op drukke websites héél wat database activiteit uit en verlicht zo grondig de database server.

Hoe werkt memcached?

Maar hoe werkt het dan? Data in memcached plaatsen gebeurt via een ‘key‘. Aan een ‘key‘ kan je een ‘value‘ koppelen. Concreet betekent dit dat je bv. een key genaamd ‘website_nieuwsitems_homepage‘ kan hebben in Memcached met als value alle nieuwsberichten van de homepage. De data terug opvragen van memcached betekent een request doen voor de key ‘website_nieuwsitems_homepage‘. Belangrijk om te onthouden is dat de waarden in memcached vluchtig zijn en dat het nooit gebruikt mag worden om gegevens op te slaan die bewaard moeten blijven. Daar dient de database voor, die heeft persistente opslag. Data in memcached plaatsen is even eenvoudig als het weer opvragen. In PHP zijn er meerdere ‘extensions’ om memcached aan te spreken, de bekendste zijn Memcache en Memcached. Niet enkel hun naam is gelijkaardig (slechts een ‘d’ verschil), ook in werking zijn ze bijna identiek. Memcached is vooral interessant in read-heavy omgevingen. Een write-actie, zoals bv. een signup van een gebruiker in je applicatie, kan je niet cachen in memcached. Die data moet naar de database. Het veelvuldig opvragen van de info van die gebruiker daarentegen, de read-requests, zouden wel in memcached kunnen.

Enkel een caching oplossing?

Memcached kan meer doen dan enkele data cachen, al wordt het daar het meeste voor gebruikt. Het is ook een handige tool om data beschikbaar te maken voor meerdere systemen, net als een database server. Het kan een centraal punt in een oplossing zijn waar systemen data naartoe kunnen schrijven en weer kunnen ophalen. Er zijn zelfs oplossingen waar memcached als job-queue beschouwd wordt, al zijn daar betere tools voor (zoals bv. Gearman Job Server). Zo wordt geregeld beroep gedaan op memcached om sessie informatie van gebruikers op te slaan, zoals bv. de traditionele PHP sessies die standaard op de harde schijf worden opgeslagen (of in het geval van Drupal in de database). Door alle sessies van een cluster webservers te koppelen aan één memcached (of een redundante set aan memcacheds) kan een gebruiker ingelogd blijven op alle servers, ook als die achter een load balancer zou staan.

Geheugen verbruik in memcached

Memcached wordt ingesteld om een maximaal aantal MB’s of GB’s in geheugen te houden. Op een server kan je memcached bijvoorbeeld instellen om 512MB geheugen te alloceren. Eens memcached items ontvangt om bij te houden en het geheugen langzaam aan vult zal het een Least Recently Used (LRU) systeem gebruiken om oude items uit de cache te gooien. Een waarde opslaan in memcached lukt dus altijd, daar hoef je als ontwikkelaar geen rekening mee te houden. Als memcached ‘vol’ zou zitten en er moet een nieuwe waarde opgeslagen worden, zal de minst recent gebruikte waarde automatisch uit de cache verwijderd worden. Als je dieper duikt in de werking van memcached kom je op het gebruik van ‘slabs‘. Stel dat memcached 512MB geheugen krijgt dan deelt het dat intern in meerdere stukken, of slabs, op. Een ‘slab‘ slaat keys op die (ongeveer) dezelfde grootte hebben. Wil je een item opslaan van enkele KB’s groot, dan komt het in de eerste slab terecht. Zijn er items die meerdere MB’s groot zijn, dan wordt de slab aangesproken verantwoordelijk voor die grootte. Meestal hoef je hier geen rekening mee te houden, enkel op erg drukke memcached servers waar te veel items ‘evicted’ worden (dus uit de cache verwijderd worden) is het interessant hier verder onderzoek naar te doen. Een goede uitleg over wat slabs zijn, hoe ze werken en waarom ze gebruikt worden in memcached vind je in de MySQL manual: Memory Allocation with Memcached.

Memcached in Drupal, WordPress, Joomla, …

Memcached is gelukkig ook al geïmplementeerd in populaire CMS systemen als Drupal, WordPress, Joomla, … Meestal in de vorm van extra plugins of modules. Zo kan u bijvoorbeeld in uw favoriete CMS meer dan waarschijnlijk al een plugin vinden om Memcached te gebruiken. Die plugin kan dan de data die normaal uit MySQL komt in geheugen bijhouden voor een snellere bezoekers-ervaring voor uw klanten. Afhankelijk van uw website en de complexiteit ervan kan dit een snelheidswinst van 1% tot 25% opleveren. Zonder érg veel werk.

Waar bij Nucleus kan ik memcached gebruiken?

Bij Nucleus kan je een memcached service draaien vanaf een Dedicated Server of een Cloud Server. Of op uw eigen server in colocatie, natuurlijk. Jammergenoeg is memcached nog niet mogelijk op shared hosting. Vanuit uw applicatie kan u met bijna elke programmeertaal ook memcached aanspreken. Ook vanuit Windows omgevingen, het is niet beperkt tot enkel de Linux wereld. Klinkt het interessant? Dan kan onze support afdeling bekijken of memcached op je server geïnstalleerd kan worden en of je applicatie hiervoor geschikt is. Heb je vragen? Contacteer ons gerust per mail of laat iets weten via Twitter op @nucleus_hosting of onze Facebook pagina.

Gerelateerde berichten
Nucleus - Laravel

Wat is de beste manier om Laravel te hosten?

Wat is de beste manier om Laravel te hosten? Door Laravel, Forge en gebruiksvriendelijke deployments te combineren met managed hosting. Lees hier waarom!

Lees meer

Spectre en Meltdown

Spectre en Meltdown: wat was de échte impact ?

Spectre en Meltdown – en meer bepaald het patchen van de lekken – hebben zowat elke system administrator bezig gehouden de afgelopen dagen. Nu […]

Lees meer

Spectre en Meltdown

Important information regarding Meltdown & Spectre CPU vulnerabilities

By exception, this blogpost will be in English to inform all our clients. News has come out about highly critical vulnerabilities in all Intel […]

Lees meer