Redis of Memcached? Voor Magento 2 sessions is het antwoord bijna altijd Redis. Maar waarom? En wanneer is Memcached toch de betere keuze? We zetten benchmarks, configuratie en session locking naast elkaar.
Redis vs Memcached voor Magento 2 sessions
Redis of Memcached? Voor Magento 2 sessions is het antwoord bijna altijd Redis. Maar dat verdient uitleg, want Memcached is niet per definitie slecht — het heeft gewoon een ander toepassingsgebied.
Magento 2 gebruikt twee soorten cache: object cache (configuratie, layout, blocks) en session storage (klantgegevens, winkelwagen, formulierdata). Voor allebei kun je Redis of Memcached inzetten. De keuze heeft concrete gevolgen voor reliability en gedrag bij problemen.
Dit artikel zet de feiten naast elkaar, inclusief configuratie en benchmarks.
Wat je leert in dit artikel
- Hoe Magento 2 sessions en object cache intern werkt
- Technische verschillen tussen Redis en Memcached
- Benchmarks op request-niveau
- Session locking: waarom dit relevant is voor e-commerce
- De aanbevolen configuratie voor productieomgevingen
Hoe Magento 2 session storage werkt
Magento slaat per bezoeker een session op. Die bevat:
- Winkelwageninhoud
- Inlogstatus en klantdata
- Formulierdata en CSRF-tokens
- Flash messages (toevoegen aan winkelwagen, foutmeldingen)
Standaard slaat Magento sessions op als bestanden op het filesystem. Dat werkt, maar schaalt slecht zodra je meerdere applicatieservers hebt. Bestands-based sessions werken niet over servers heen zonder gedeeld filesystem.
Redis en Memcached lossen dit op: beide zijn in-memory datastores die over meerdere applicatieservers bereikbaar zijn.
Technische vergelijking
| Eigenschap | Redis | Memcached |
|---|---|---|
| Data structuren | Strings, lists, hashes, sets, sorted sets | Alleen strings (key-value) |
| Persistence | AOF en RDB (optioneel) | Geen — data verdwijnt bij herstart |
| Clustering | Ingebouwd (Redis Cluster) | Client-side sharding |
| Session locking | Ja (via SETNX) | Nee |
| Max key size | 512MB | 1MB |
| Replicatie | Master-replica ingebouwd | Niet ingebouwd |
| Licentie | BSD (open source) | BSD (open source) |
| Memory overhead | Iets hoger | Laag |
Het meest relevante verschil voor Magento: session locking en persistence.
Session locking: waarom het ertoe doet
Session locking voorkomt race conditions. Stel: een gebruiker klikt snel achter elkaar op twee knoppen die allebei de session aanpassen (bijv. twee producten snel toevoegen aan de winkelwagen). Zonder session locking kunnen beide requests tegelijk de session lezen, allebei een eigen versie schrijven, en één schrijfoperatie overschrijft de ander.
Het resultaat: één van de twee producten verdwijnt uit de winkelwagen.
Redis lost dit op met SETNX (SET if Not eXists): de eerste request plaatst een lock, de tweede wacht tot de lock vrij is. Memcached heeft dit mechanisme niet. Er zijn workarounds, maar die zijn fragiel.
Voor e-commerce is dit geen edge case. Gebruikers die snel klikken — zeker op mobiel — raken winkelwageninhoud kwijt. Dat kost conversies.
// Magento's Redis session handler gebruikt SETNX voor locking
// /vendor/magento/framework/Session/SaveHandler/Redis.php (vereenvoudigd)
public function write($sessionId, $sessionData): bool
{
// Vergrendel de session
$lockKey = 'session_lock_' . $sessionId;
$locked = $this->redis->set($lockKey, 1, ['NX', 'EX' => 30]);
if (!$locked) {
// Wacht en probeer opnieuw
usleep(100000); // 100ms wachten
return $this->write($sessionId, $sessionData);
}
// Schrijf session data
$this->redis->setex($sessionId, $this->lifetime, $sessionData);
// Lock vrijgeven
$this->redis->del($lockKey);
return true;
}
Persistence: wat gebeurt er bij een herstart?
Memcached is volledig in-memory zonder persistence. Bij een herstart van de Memcached-server is alle data weg. Alle actieve sessions zijn ongeldig. Alle ingelogde gebruikers worden uitgelogd. Alle winkelwagens zijn leeg.
Redis biedt twee persistence-mechanismen:
- RDB (Redis Database): periodieke snapshots naar schijf. Bij herstart laadt Redis de laatste snapshot.
- AOF (Append Only File): elke schrijfoperatie wordt naar een log geschreven. Maximaal 1 seconde dataverlies.
Voor session storage op een productieomgeving stel je AOF in:
# /etc/redis/redis.conf
appendonly yes
appendfsync everysec # Sync elke seconde naar schijf
Dit garandeert dat sessions overleven bij een onverwachte herstart.
Benchmarks
Wij hebben Redis 7.x en Memcached 1.6.x gemeten op een standaard Magento 2.4.7-setup met 50 gelijktijdige gebruikers.
| Operatie | Redis (AOF aan) | Redis (AOF uit) | Memcached |
|---|---|---|---|
| Session read | 0.8ms | 0.6ms | 0.5ms |
| Session write | 1.2ms | 0.7ms | 0.4ms |
| Object cache read | 0.7ms | 0.6ms | 0.5ms |
| Object cache write | 1.1ms | 0.6ms | 0.4ms |
| P99 latency (50 concurrent) | 4.2ms | 3.1ms | 2.8ms |
Memcached is sneller — maar het verschil is klein. In een Magento-pagina die 200-800ms duurt, is 0.3-0.5ms verschil in session-latency statistisch irrelevant.
De reliability-voordelen van Redis wegen ruimschoots op tegen het minimale snelheidsverschil.
Configuratie: Redis voor Magento 2
Installatie
sudo apt-get install redis-server -y
sudo systemctl enable redis-server
sudo systemctl start redis-server
Magento configureren voor Redis sessions
// app/etc/env.php
'session' => [
'save' => 'redis',
'redis' => [
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'timeout' => '2.5',
'persistent_identifier' => '',
'database' => '2', // Gebruik database 2 voor sessions
'compression_threshold' => '2048',
'compression_library' => 'gzip',
'log_level' => '4',
'max_concurrency' => '6', // Max gelijktijdige session-locks
'break_after_frontend' => '5',
'break_after_adminhtml' => '30',
'first_lifetime' => '600',
'bot_first_lifetime' => '60',
'bot_lifetime' => '7200',
'disable_locking' => '0', // Locking AAN houden
'min_lifetime' => '60',
'max_lifetime' => '2592000',
'sentinel_master' => '',
'sentinel_servers' => '',
'sentinel_connect_retries' => '5',
'sentinel_verify_master' => '0',
]
],
Redis voor object cache
Gebruik een aparte Redis-database voor object cache (niet dezelfde als sessions):
// app/etc/env.php
'cache' => [
'frontend' => [
'default' => [
'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
'backend_options' => [
'server' => '127.0.0.1',
'database' => '0', // Database 0 voor object cache
'port' => '6379',
'password' => '',
'compress_data' => '1',
'compression_lib' => 'gzip',
],
],
'page_cache' => [
'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
'backend_options' => [
'server' => '127.0.0.1',
'database' => '1', // Database 1 voor FPC
'port' => '6379',
'password' => '',
'compress_data' => '0',
],
],
],
],
Geheugenlimieten instellen
# /etc/redis/redis.conf
# Totaal beschikbaar geheugen voor Redis
maxmemory 512mb
# Eviction policy: verwijder keys met kortste TTL als geheugen vol is
maxmemory-policy allkeys-lru
# Save policy voor AOF
appendonly yes
appendfsync everysec
Wanneer is Memcached een optie?
Eerlijk gezegd: zelden voor Magento 2 in productie. Maar er zijn randgevallen.
Shared hosting waarbij Redis niet beschikbaar is maar Memcached wel. In dat geval is Memcached beter dan bestandsstorage. Alleen object cache, geen sessions. Als je sessions elders opslaat (bijv. in de database) en Redis niet beschikbaar is, is Memcached een acceptabele keuze voor object cache. Object cache heeft geen session locking nodig. Extreme write-throughput waarbij het geheugenoverhead van Redis een probleem is en persistence niet nodig is. Dit is een zeer specifieke situatie die zelden optreedt bij standaard Magento-installaties.Veelgemaakte fouten
- Locking uitschakelen voor performance —
disable_locking = 1lijkt sneller, maar introduceert race conditions. Nooit doen op een productieomgeving met echte gebruikers.
- Sessions en object cache in dezelfde Redis-database — Als de cache vol raakt en Redis begint te evicten, kunnen sessions worden verwijderd. Gebruik altijd aparte databases.
- Geen maxmemory instellen — Redis zonder geheugenlimiet gebruikt onbeperkt RAM. Op een server met meerdere processen kan dit OOM-kills veroorzaken.
- Redis niet monitoren — Een Redis-server die 100% van zijn geheugen gebruikt en begint te evicten, gedraagt zich alsof het werkt, maar verwijdert stille data. Monitor
used_memoryvsmaxmemory.
Best practices
| Practice | Waarom |
|---|---|
| Gebruik aparte Redis-databases per cache-type | Voorkomt ongewenste eviction van sessions |
| Zet AOF persistence aan voor sessions | Sessions overleven herstarts |
Monitor redis-cli info stats dagelijks | Detecteert eviction en geheugendruk vroeg |
| Gebruik Redis Sentinel bij kritieke shops | Automatische failover bij Redis-uitval |
Stel max_concurrency in op basis van verkeer | Te hoog = resource verspilling, te laag = wachtrij |
Conclusie
Redis is de juiste keuze voor Magento 2 sessions. Punt. Session locking, persistence en betere Redis-integratie in Magento's codebase maken Memcached inferieur voor dit specifieke toepassingsgebied.
Voor object cache is het verschil kleiner, maar Redis wint alsnog op features en reliability. Het minimale snelheidsvoordeel van Memcached is in de praktijk niet meetbaar op een normale Magento-paginalading.
De configuratie-investering is een uur. De reliability-winst is permanent.
Meer over Magento performance en hosting? Bekijk onze Magento hosting-pagina of onze Magento 2 diensten voor een volledige performance-audit. Lees ook ons artikel over Varnish configureren voor Magento 2 voor de volledige cachingstack.
Heb je Redis-problemen op je Magento-omgeving? Neem contact op — wij kijken er naar.

Geschreven door Ruthger Idema
15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.
Meer over ons team →