...

Redis-verbindingspooling in PHP voor maximale prestaties

Redis-pooling In PHP vermindert dit de overhead van verbindingen, verlaagt het de latentie en zorgt het ervoor dat Redis bij hoge belasting geen knelpunt wordt. Ik laat zien hoe ik met phpredis en PHP-FPM verbindingspools zo instel dat sessies, caches en wachtrijen meetbaar sneller reageren.

Centrale punten

Ik vat de belangrijkste punten kort en duidelijk samen, zodat je pooling meteen op de juiste manier kunt inschakelen. pooling heeft invloed op transportkosten, foutpatronen en capaciteitsplanning; daarom loont een gestructureerde implementatie de moeite. Ik concentreer me op phpredis, PHP-FPM en asynchrone omgevingen, omdat hier de grootste effecten worden gerealiseerd. Doordachte standaardinstellingen helpen risico's zoals „vervuilde“ verbindingen te vermijden en constant korte responstijden te bereiken. Uiteindelijk ken je de instellingen waarmee je je Verbindingen onder controle krijgt.

  • pconnect gebruiken in plaats van connect voor herbruikbare sockets
  • INI-limieten voor zwembadgrootte, liveness-controles, patronen
  • FPM-stemming vs. Redis maxclients onder de loep
  • Time-outs het kort houden en foutpaden testen
  • Voorwaarde schoonmaken voordat het teruggebracht wordt naar de pool

De lijst geeft de prioriteiten weer die ik stel om snel resultaten te boeken, zonder de code lukraak te wijzigen. Persistent Verbindingen komen pas goed tot hun recht als de limieten van de server en de processen op elkaar zijn afgestemd. Ik voorkom veelvoorkomende fouten door de limieten strak in te stellen en duidelijke opschoningsregels toe te passen. Zo blijft de latentie laag en verwerkt Redis ook pieken in de belasting betrouwbaar. Wie doelgericht meet, ziet snel waar nog potentieel ligt en hoeveel buffer de Infrastructuur heeft.

Hoe connection pooling latentie en resources bespaart

Elke nieuwe TCP-handshake kost tijd en belast het besturingssysteem onnodig, daarom gebruik ik Verbindingen Consequent. Met persistente sockets vermijd ik herhaalde TLS-handshakes, wat bij veel korte bewerkingen zoals GET/SET een groot verschil maakt. Pools voorkomen dat er duizenden kortstondige sockets ontstaan die in TIME_WAIT blijven hangen. Ik houd het aantal gelijktijdige sockets laag en versnel toch de verwerking. Zo nemen de doorvoer en de reactiesnelheid toe, zonder dat ik de logica in de applicatiecode ingrijpend hoef te wijzigen.

Pooling komt vooral goed tot zijn recht in PHP-FPM-configuraties, omdat elk worker-proces een eigen zwembad beheerd. Dit voorkomt dat Redis bij pieken in de belasting te maken krijgt met een stortvloed aan verbindingen. Bij sessies, caches en wachtrijen merk ik direct het voordeel, aangezien deze workloads veel korte bewerkingen genereren. Wie zich verder wil verdiepen in sessies, vindt bij Redis-sessies in PHP de juiste start. Ik stel de parameters zo in dat netwerkfouten snel opvallen en de applicatie indien nodig overschakelt naar fallbacks.

In de praktijk verdwijnt een groot deel van de „koude“ latentie, omdat de verbinding al tot stand is gebracht en er geen DNS- of TLS-overhead ontstaat. Levendigheid-Controles zorgen ervoor dat defecte sockets helemaal niet in het volgende verzoek terechtkomen. Zo blijft het foutenpercentage laag en voelt de gebruikersinteractie aanzienlijk vlotter aan. Ik houd me aan kleine, logische stappen: pconnect activeren, limieten instellen, Liveness inschakelen. Daarna controleer ik hoe de statistieken zich gedragen en of de Redis-belasting, het aantal FPM-processen en het gedrag van de app op elkaar aansluiten.

phpredis: connect versus pconnect – wat gebeurt er nu eigenlijk?

Met phpredis Ik maak een duidelijk onderscheid tussen `connect()` en `pconnect()`. `connect()` opent één tijdelijke verbinding per verzoek en sluit deze aan het einde weer. `pconnect()` maakt persistente sockets aan, die de FPM-worker gedurende meerdere verzoeken behoudt. phpredis wijst persistente verbindingen toe aan een pool op basis van host, poort, authenticatie en een optionele persistent_id. Zo maakt mijn code bij elke aanroep gebruik van een reeds bestaande verbinding, in plaats van elke keer opnieuw te starten.

De volgende tabel helpt me om de verschillen snel te beoordelen en de juiste keuze te maken. Overzicht Dat bespaart me tijd bij het debuggen en het plannen van de limieten. Ik koppel dit aan metingen om de effecten in mijn eigen stack te zien. Vooral bij TLS levert pconnect merkbare voordelen op. Hoe korter de bewerking, hoe groter het voordeel van de bespaarde handshakes.

Aspect connect() pconnect()
Levensduur Alleen de huidige aanvraag Totdat FPM-Worker afloopt
Overhead bij het handen schudden Per verzoek nieuw Eenmalig, daarna hergebruik
pooling Geen zwembad Interne pool per werknemer
Fout afbeelding Veel korte sockets Een klein aantal, duurzame sockets
Aanbeveling Bijzondere gevallen, toetsen Dagelijkse bedrijfsvoering

Ik blijf bij het productiebedrijf bij pconnect en gebruik connect alleen voor diagnose of uitzonderingsgevallen. Permanente sockets gedragen zich over een groot aantal verzoeken heen gelijkmatiger. Tegelijkertijd let ik erop dat ik geen „status“ achterlaat die later problemen veroorzaakt. Dit geldt vooral voor transacties en opties, die ik na elk gebruik opschoon. Zo krijgt de volgende verzoek een schone verbinding en blijft de app voorspelbaar.

Belangrijke INI-parameters voor een effectieve pooling

De juiste INI-instellingen bepalen hoe gul je zwembad omgaat met verbindingen. Ik stel `redis.pconnect.pooling_enabled` in op 1, zodat pooling actief blijft. Met `redis.pconnect.connection_limit` beperk ik het aantal verbindingen per pool, bijvoorbeeld tot 32. `redis.pconnect.echo_check_liveness` controleert hergebruikte sockets en verwijdert defecte exemplaren. Een consistent `pool_pattern` zorgt ervoor dat phpredis verbindingen correct groepeert.

Een compacte startopstelling ziet er als volgt uit: Beperk 32, pooling ingeschakeld, liveness ingeschakeld. Hierdoor neemt het aantal TIME_WAIT-sockets merkbaar af. Ik houd de clients en de latenties in de gaten en pas de instellingen stap voor stap aan. Als er time-outs optreden, kan ik de limieten verhogen of het aantal FPM-workers aanpassen. Zo kom ik steeds dichter bij een toestand waarin het systeem ook onder belasting soepel blijft draaien.

redis.pconnect.pooling_enabled = 1
redis.pconnect.connection_limit = 32
redis.pconnect.echo_check_liveness = 1

Ik kies waarden nooit „op goed geluk“, maar meet eerst de Reactietijden. Vervolgens pas ik de limieten aan totdat Redis, FPM en de app soepel samenwerken. Grote pools klinken aantrekkelijk, maar ze verhogen het risico dat de `maxclients`-limiet wordt overschreden. Kleine, goed benutte pools leveren meestal betere prestaties. Dat bespaart RAM aan beide kanten en zorgt voor gelijkmatige responstijden.

PHP-FPM en Redis goed op elkaar afstemmen

Ik bepaal eerst hoeveel Werknemer per pm.max_children draaien. Elke worker kan meerdere Redis-sockets aanhouden, dus ik vermenigvuldig de verbindingslimieten niet zomaar. Redis zelf heeft een maxclients-limiet, die ik niet overschrijd. Ik bereken: FPM-workers × verbindingen per pool × applicaties, en vergelijk dat met maxclients. Als er reserves overblijven voor admin- of monitoring-clients, val ik onder belasting niet uit de curve.

Time-outs maken ook deel uit van de fijnafstelling. Time-outs Typische cache-aanroepen duren tussen 0,5 en 1,5 seconden, waardoor storingen snel worden opgemerkt. Ik stel connect_timeout en read_timeout conservatief in en log fouten gedetailleerd. Zo kan ik zien of het netwerk vastloopt of dat Redis overbelast is. Als er vaak resets of time-outs voorkomen, pas ik limieten, time-outs en het aantal workers in kleine stapjes aan.

Ik maak een duidelijk onderscheid tussen foutpaden in apps en cachefouten. Tegenvallers mogen het verzoek niet blokkeren als Redis even hapert. Dit verbetert de algehele gebruikerservaring en zorgt ervoor dat frontends responsief blijven. Goede logbestanden laten me zien of ik te maken heb met overbelasting of met verbroken verbindingen. Op basis daarvan pas ik de workers, de poolgroottes of de Redis-server zelf aan.

Een concrete tip: begin met „Kerne × 2“ als limiet per worker en controleer vervolgens de werkelijke belasting. Gemeten waarden Vertrouw in elke omgeving op je intuïtie. Houd de statistieken goed in de gaten en schakel geleidelijk op als er verzoeken in de wachtrij staan. Zo maak je effectief gebruik van de hardware. Tegelijkertijd blijft het aantal open sockets overzichtelijk.

Ik kijk regelmatig in INFO clients en CLIENT LIST om de actuele Belasting te zien. Deze waarden laten zien of pools effectief zijn of dat er veel nieuwe verbindingen tot stand komen. Als ik pieken waarneem, controleer ik DNS, Keep-Alive en liveness-checks. Bij twijfel test ik zonder TLS om de invloed van handshakes te meten. Daarna schakel ik TLS weer in met Session-Resumption.

Veilig gebruik van permanente verbindingen

Persistente sockets behouden hun Voorwaarde totdat de worker afloopt, daarom ruim ik expliciet op. Ik sluit transacties netjes af met EXEC of DISCARD. Per verzoek stel ik consistent de benodigde database in via SELECT, samen met alle opties die mijn code vereist. Voordat de waarde wordt geretourneerd, mag er geen pipeline of MULTI open blijven staan. Alleen zo blijft de poolverbinding netjes bruikbaar.

Liveness-controles vóór hergebruik zijn verplicht. Defecten Sockets blokkeer ik onmiddellijk en forceer ik een herstart. Ik maak een duidelijk onderscheid tussen „server down“ en „time-out“, omdat ik daar verschillend op reageer. Bij time-outs schakel ik snel over op fallbacks, bij verbroken verbindingen geef ik de voorkeur aan opnieuw verbinden. Zo blijft de app voorspelbaar, ook als het netwerk kuren vertoont.

Ik leg vast welke opties er voor een verbinding zijn ingesteld, zodat er later geen verrassingen ontstaan. Transacties Ik leg dit speciaal vast, want hier blijven fouten vaak hangen. Voor bibliotheken kies ik varianten die pconnect correct doorgeven. In tests simuleer ik netwerkonderbrekingen, herstarts van de Redis-server en pieken in de vertraging. Pas als de app dat moeiteloos aankan, ga ik live.

Een veelvoorkomend struikelblok zijn globale variabelen in helperklassen. Opruimen voorkomt na elk gebruik dat vlaggen, alleen-lezen-modi of time-outs „blijven hangen“. Ik houd de verbindingslogica centraal, bijvoorbeeld in een serviceklasse. Dat verlaagt het foutenpercentage in de hele code. Bovendien maakt het het testen met mocks of alternatieve backends eenvoudiger.

Wie pooling maar zelden aanpast, vergeet al snel de gevolgen voor tests, de CLI of cronjobs. CLI-Scripts profiteren ook van pconnect als ze vaak worden uitgevoerd. Voor scripts die lang draaien, pas ik de liveness-controles aan. Voor eenmalige scripts volstaat connect met korte time-outs. Uniforme standaardinstellingen voorkomen verrassingen tijdens het gebruik.

Pooling in asynchrone PHP-stacks (Swoole & Co.)

In asynchrone omgevingen zoals Swoole Langlopende PHP-processen werken met eigen worker-modellen. Ik initialiseer de Redis-pool bij het opstarten van de worker of zodra er voor het eerst behoefte aan is. Coroutines lenen een verbinding en geven deze na gebruik weer terug. De grootte van de pool mag dynamisch toenemen, maar blijft beperkt. Zo verdeel ik sockets efficiënt over taken en verzoeken.

Een geabstraheerd RedisPool-object zorgt ervoor dat de applicatiecode overzichtelijk blijft. API's Zoals getConnection() en releaseConnection() kapselen details in en voorkomen ze geheugenlekken. Ik registreer de uitleentijd, foutpercentages en wachttijden in de pool. Als de wachttijden toenemen, schaal ik de poolgrootte of het aantal workers op. Dit voorkomt backpressure en zorgt voor korte responstijden.

Ook hier geldt: laat geen resten achter in de verbindingen. Transparantie Uit de logbestanden blijkt of de liveness-controles op tijd in werking treden. Ik test failover-paden gericht, inclusief DNS-fouten en pakketverlies. Zo merk ik al vroeg of de herverbindingsstrategieën correct werken. Dat loont vooral bij belastingstests.

Ik houd vooral rekening met TLS-overhead, omdat asynchrone systemen veel parallelle bewerkingen genereren. Hervatting en Keep-Alive verlagen de kosten per socket. Pipelining en batch-reads helpen bovendien om het aantal round-trips te verminderen. De combinatie met een gestroomlijnde serializer bespaart nog eens extra tijd. Uiteindelijk gaat het erom hoe snel de gebruiker zijn resultaat te zien krijgt.

Voor statistieken gebruik ik tags per worker en per pool. Opsporen Op verzoekniveau wordt zichtbaar wanneer een taak op een verbinding wacht. Dit brengt knelpunten aan het licht die bij louter Redis-monitoring niet zichtbaar zijn. Zo vind ik de optimale balans tussen de grootte van de pool en het aantal workers. Daarna stabiliseert de prestatie meetbaar.

Redis als cachelaag bij hosting

In hostingomgevingen gebruik ik Redis voor sessies, paginacache en objectcache, en daarom pooling is verplicht. Frequente, korte toegangen profiteren sterk van hergebruikte verbindingen. Voor WordPress houd ik rekening met de specifieke kenmerken van de objectcache en controleer ik het gedrag onder belasting. Wie meer wil weten over typische valkuilen, kan kijken in Objectcache in WordPress. Zo voorkom ik lange TTFB-pieken en zorg ik ervoor dat de pagina’s snel worden weergegeven.

Ik sla sessies op in Redis, zodat PHP-FPM-workers onafhankelijk zijn van de lokale Opslag te doen. Met pooling verminder ik de locking-overhead in de request en ontlast ik de IO. Het is belangrijk om een duidelijke scheiding aan te brengen tussen sessiesleutels, app-sleutels en beheertools. Zo behoud ik het overzicht bij de capaciteitsplanning. Daarnaast documenteer ik TTL's om oude vermeldingen op een gecontroleerde manier te laten verlopen.

In multi-tenant-omgevingen segmenteer ik pools op basis van persistent_id of host, zodat tenants strikt gescheiden van elkaar kunnen werken. Isolatie vermindert het risico dat een klant de verbindingen van anderen in beslag neemt. Ik zorg ervoor dat de limieten per klant realistisch blijven. Daarnaast bouw ik reserves in, zodat beheertaken niet vastlopen. Dit zorgt voor een consistente gebruikerservaring in alle applicaties.

Voor snelle implementaties heb ik een standaardconfiguratie klaarstaan, die ik per app nauwkeurig aanpas. Standaard omvatten pconnect, Liveness, gematigde limieten en duidelijke time-outs. Vervolgens wordt de schaalbaarheid getest met belastingstests. Als een test mislukt, pas ik de limieten en het aantal FPM-workers in kleine stapjes aan. Zo voorkom ik overdreven reacties en houd ik de leercurve vlak.

Ik houd per app bij hoeveel verbindingen er tijdens de piek nodig waren. Planning Op basis van actuele cijfers worden verrassingen bij pieken in het verkeer voorkomen. Dat bespaart kosten en tijd tijdens het gebruik. Tegelijkertijd blijft de Redis-server rustig draaien. En krijgen de gebruikers snellere antwoorden.

Pub/Sub, blocking-commando’s en wachtrijen correct in een pool onderbrengen

Pub/Sub- en blocking-commando’s zoals BLPOP of XREAD blokkeren de socket. Deze Langlaufer Ik parkeer nooit in de algemene pool. In plaats daarvan gebruik ik per worker een aparte, speciale Redis-client die uitsluitend bestemd is voor blocking- of pub/sub-taken. Zo blijft de reguliere pool vrij voor snelle GET/SET-aanroepen en blijft de latentie van de webverzoeken constant laag.

Bij BRPOP-workers stel ik het aantal parallelle consumenten in en houd ik de time-outs kort, zodat herverbindingen bij storingen snel tot stand komen. Voor Pub/Sub houd ik lees- en schrijfverbindingen strikt gescheiden. Ik beëindig abonnementen op een gecontroleerde manier voordat de worker wordt gerecycled, om vastgelopen sockets te voorkomen. Deze werkwijze voorkomt dat pool-sockets „per ongeluk“ in blokkerende modi blijven hangen.

Transacties, WATCH/UNWATCH en Lua-scripts

Pooling versterkt de effecten van toestanden zoals MULTI/EXEC, WATCH of scripting-caches. Na afloop van transacties roep ik consequent EXEC of DISCARD aan en voer ik UNWATCH uit als ik gebruikmaak van optimistische vergrendeling. Bij Lua-scripts slaat Redis de scripts per verbinding op in de cache; ik gebruik EVALSHA met een fallback naar EVAL bij NOSCRIPT-fouten, zodat de code robuust blijft bij herverbindingen en poolwisselingen.

function evalsha_safe(Redis $r, string $sha, array $keys = [], array $argv = []) {
  try {
    return $r->evalSha($sha, array_merge($keys, $argv), count($keys));
  } catch (RedisException $e) {
    // NOSCRIPT-Fallback
    if (str_contains($e->getMessage(), 'NOSCRIPT')) {
      // $script hier passend bereitstellen
      return $r->eval($GLOBALS['MY_SCRIPT'], array_merge($keys, $argv), count($keys));
    }
    throw $e;
  }
}

In mijn `finally`-blok ruim ik bovendien `UNWATCH` op, voor het geval `WATCH` is ingesteld. Zo blijft de verbinding „neutraal“ wanneer deze terugkeert naar de pool, en kan het volgende verzoek werken zonder verborgen voorwaarden.

Unix-sockets, TLS en serialisatie/compressie

Als PHP en Redis op dezelfde host draaien, geef ik de voorkeur aan Unix sockets. Ze besparen TCP-overhead en verminderen de latentie nog verder. De `persistent_id` blijft hetzelfde, alleen het eindpunt verandert. Op systemen met meerdere gebruikers let ik op de juiste socketrechten.

$r = new Redis();
$r->pconnect('/var/run/redis/redis.sock', 0, 0.5, 'app_pool_unix');
$r->setOption(Redis::OPT_READ_TIMEOUT, 1.0);

Met TLS schakel ik sessiehervatting in, houd ik certificaatketens compact en voorkom ik herhaling van DNS-opzoekingen. Korte keep-alive-tijden in het besturingssysteem (tcp_keepalive) helpen om defecte paden sneller te herkennen, zonder al te agressief opnieuw verbinding te maken.

Ik optimaliseer de serializer voor gegevensoverdracht. igbinary Dit verkort de payloads en de CPU-tijd merkbaar ten opzichte van PHP-serialisatie. Waar dat zinvol is, schakel ik lichte compressie in.

$r->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY);
$r->setOption(Redis::OPT_COMPRESSION, Redis::COMPRESSION_LZF);

Ik maak selectief gebruik van serialisatie/compressie: voor zeer kleine waarden is het niet de moeite waard, maar voor grote objecten in de objectcache vaak wel degelijk. Metingen in de eigen stack geven snel duidelijkheid.

Clusters, Sentinel en failover met pools

Op Cluster-In mijn setups werk ik met RedisCluster en schakel ik persistente verbindingen in. Elk knooppunt beheert zijn eigen sockets in de worker. Ik houd omleidingen (MOVED/ASK) in de gaten en controleer of deze toenemen – een teken van herverdeling of een onjuiste sleutelverdeling.

$rc = new RedisCluster('cluster', ['10.0.0.1:6379','10.0.0.2:6379'], 0.5, 1.0, true); // persistent
$rc->setOption(Redis::OPT_READ_TIMEOUT, 1.0);

Met Sentinel Een extra laag houdt toezicht op de master. Bij een failover verwijder ik doelgericht alle verbindingen met de oude master uit de pool en forceer ik een herstart. Ik plan korte DNS-TTL's of werk met Sentinel-Discovery rechtstreeks via een IP-lijst, zodat de omschakeling snel van kracht wordt. Liveness-checks sporen oude, inactieve sockets betrouwbaar op.

Beperkingen aan de serverzijde, eviction en keep-alive

Pooling werkt alleen als Redis zelf correct is geconfigureerd. Ik ben van mening dat maxclients met een buffer (10–20 %) onder de berekende bovengrens en houd rekening met extra clients (Admin, Monitoring). Ik stel de `client-output-buffer-limit` voor normal/pubsub zo in dat trage consumenten het geheugen niet overspoelen. Ik gebruik `tcp-keepalive` met mate om dode verbindingen te detecteren, zonder onnodige pakketbelasting te veroorzaken.

Bij volbelasting is de Uitzettingsbeleid over gedrag en latenties. Voor caches gebruik ik ‘volatile’- of ‘allkeys’-varianten, afhankelijk van het ontwerp van de sleutels. Belangrijk: evictions zijn zichtbaar in de statistieken; als ze sterk toenemen, is de cache te klein of is de TTL-strategie ongeschikt. Ik breng correcties aan voordat het aantal time-outs toeneemt.

Capaciteitsberekening met voorbeeld

Een praktisch rekenmodel voorkomt uitschieters: stel dat 12 FPM-workers en drie apps dezelfde Redis delen (sessies, cache, wachtrij). Per worker plan ik 2–3 sockets per app (korte bewerkingen), wat neerkomt op ongeveer 12 × 3 × 3 = 108 theoretische sockets. Met connection_limit 16 per pool, en bij daadwerkelijke belasting komen we in de praktijk vaak uit op een aanzienlijk lager aantal (60–80). Bij maxclients 1.000 blijft er ruimschoots reserve over voor beheer- en monitoringclients en voor sporadische CLI-taken. Ik meet regelmatig de piek en verlaag de limieten als deze nooit worden bereikt – zo blijft het geheugengebruik per verbinding laag.

Backoff, Circuit Breaker en Graceful Reload

Bij fouten vertrouw ik op exponentiële back-off met jitter, om ‘Thundering Herd’-effecten te voorkomen. Na een paar mislukte pogingen open ik een circuitbreaker en schakel ik tijdelijk over op fallbacks, in plaats van de pools te overspoelen met zinloze herpogingen. Succesvolle bewerkingen sluiten de circuitbreaker snel weer af.

Op Herladen Via PHP-FPM (graceful) laat ik workers aflopen. Hierdoor worden persistente verbindingen op een geordende manier vrijgegeven. Ik houd in de gaten of er na een herlaadbeurt tijdelijk meer nieuwe verbindingen ontstaan en pas, indien nodig, de startfrequentie van nieuwe workers aan. Zo voorkom ik piekbelasting bij deployments.

Waarneembaarheid verdiepen

Ik registreer statistieken per worker, app en pool-ID. Naast de monitoring aan de Redis-kant analyseer ik de wachttijden voor een „vrije verbinding“. Als deze stijgen, is de pool te klein of bezetten blokkerende bewerkingen de sockets. Ik stel eenvoudige Hardloopboeken bijvoorbeeld: „Als time-outs > X, dan …“, inclusief een stappenreeks voor de pool-limiet, het aantal workers, de read-time-out en de analyse van de CLIENT LIST. Dergelijke playbooks versnellen het oplossen van storingen enorm.

Samenvatting en volgende stappen

Ik activeer pconnect, stel een gematigde `connection_limit` in, schakel Liveness-checks in en stem het aantal FPM-workers af op het aantal `maxclients` van Redis. Vervolgens stel ik korte time-outs in en ruim ik verbindingsstatussen op voordat ze worden teruggestuurd naar de pool. Met monitoring en kleine iteraties vind ik de optimale balans voor mijn app. Sessies, caches en wachtrijen reageren dan sneller en consistenter. Zo haal ik het maximale uit de beschikbare hardware, zonder veel aan de code te hoeven veranderen.

Vervolgens controleer ik de Grenzen mijn omgeving en meet de effecten van pooling onder belasting. Ik houd rekening met reserves voor beheer- en monitoringclients. Voor WordPress optimaliseer ik met name de objectcache en controleer ik de TTFB. In asynchrone stacks zorg ik ervoor dat het lenen en teruggeven van pools veilig verloopt. Met deze stappen bereik ik korte responstijden, lage foutpercentages en ontlastte servers.

Huidige artikelen