Hier is iets verrassends als het gaat om PHP en MySQL (ik ben niet zeker van andere talen) - niet het cachen van dingen in memcached of Redis is eigenlijk sneller. Veel sneller. Kortom, als je net je app hebt gebouwd en MySQL hebt opgevraagd, zou je er meer uit halen.
Nu voor het "waarom"-gedeelte.
InnoDB
, de standaard engine, is een uitstekende engine. In het bijzonder is het geheugenbeheer (allocatie en wat niet) superieur aan alle geheugenopslagoplossingen. Dat is een feit, je kunt het opzoeken of me op mijn woord geloven - het zal in ieder geval net zo goed presteren als Redis.
Wat gebeurt er nu in uw app - u vraagt MySQL op en slaat het resultaat in de cache op in redis. MySQL is echter ook slim genoeg om de resultaten in de cache te bewaren. Wat je zojuist hebt gedaan, is een extra bestandsdescriptor maken die nodig is om verbinding te maken met Redis. Je hebt ook wat opslagruimte (RAM) gebruikt om het resultaat te cachen dat MySQL al in de cache had opgeslagen.
Hier komt nog een interessant onderdeel - de geprefereerde manier om PHP-scripts te serveren is door php-fpm
te gebruiken - het is veel sneller dan elke mod_*
rotzooi daar. Tot in de kern, php-fpm
is een supervisorproces dat onderliggende processen voortbrengt. Ze worden niet afgesloten nadat het script is geserveerd, wat betekent dat ze verbindingen met MySQL in de cache plaatsen - één keer verbinden, meerdere keren gebruiken. Kortom, als u scripts serveert met behulp van php-fpm
, zullen ze de reeds tot stand gebrachte verbinding met MySQL hergebruiken, wat betekent dat u geen verbindingen voor elk verzoek zult openen en sluiten - dit is uiterst vriendelijk voor hulpbronnen en het geeft u een bliksemsnelle verbinding met MySQL. MySQL, omdat het geheugenefficiënt is en het resultaat in de cache heeft, is veel sneller dan Redis.
Wat betekent dit nu allemaal voor u - met een goede installatie kunt u kleine code hebben die eenvoudig, gemakkelijk is, geen Redis omvat en alle problemen elimineert die u zou kunnen hebben met cache-invalidatie en wat niet, en u zult niet verspillen uw geheugen om dezelfde gegevens twee keer te bevatten.
Ingrediënten die je nodig hebt om dit te laten werken:
php-fpm
MySQL
enInnoDB
gebaseerde tabellen en vooral - voldoende RAM en getweakedinnodb_buffer_pool_size
variabel. Die bepaalt hoeveel RAM InnoDB mag toewijzen voor zijn doeleinden - hoe groter hoe beter.
Je elimineerde Redis uit het spel, je hield je code eenvoudig en gemakkelijk te onderhouden, je dupliceerde geen gegevens, je introduceerde geen extra systeem in het spel en je liet software die bedoeld is om voor gegevens te zorgen zijn werk doen. Vrij goedkope afweging voor maximale bruikbaarheid, zelfs als je alle software helemaal opnieuw compileert - het duurt niet meer dan een uur om het in gebruik te nemen.
Of je kunt gewoon negeren wat ik heb geschreven en een oplossing zoeken met Redis.