Ето едно изненадващо нещо, когато става въпрос за PHP и MySQL (не съм сигурен за други езици) - не кеширането на неща в memcached или Redis всъщност е по-бързо. Много по-бързо. По принцип, ако току-що създадохте приложението си и поискате MySQL - ще извлечете повече от него.
Сега за частта "защо".
InnoDB
, двигателят по подразбиране, е превъзходен двигател. По-конкретно, управлението на паметта (разпределение и какво ли още не) е по-добро от всякакви решения за съхранение на памет. Това е факт, можете да го потърсите или да ми повярвате на думата - поне ще се представи толкова добре, колкото Redis.
Сега какво се случва във вашето приложение - вие заявявате MySQL и кеширате резултата в redis. Въпреки това, MySQL е достатъчно интелигентен, за да запази кеширани резултати. Това, което току-що направихте, е да създадете допълнителен файлов дескриптор, който е необходим за свързване с Redis. Освен това използвахте малко място за съхранение (RAM), за да кеширате резултата, който MySQL вече е кешира.
Тук идва още една интересна част - предпочитаният начин за обслужване на PHP скриптове е чрез php-fpm
- много е по-бързо от всеки mod_*
глупости там. До ядрото, php-fpm
е процес на надзорник, който поражда дъщерни процеси. Те не се изключват след сервиране на скрипта, което означава, че кешират връзките към MySQL - свързват се веднъж, използват няколко пъти. По принцип, ако обслужвате скриптове с помощта на php-fpm
, те ще използват повторно вече установената връзка с MySQL, което означава, че няма да отваряте и затваряте връзки за всяка заявка - това е изключително удобно за ресурсите и ви позволява да имате светкавична връзка с MySQL. MySQL, като е ефективен от паметта и има кеширан резултат, е много по-бърз от Redis.
Сега какво означава всичко това за вас - наличието на правилна настройка ви позволява да имате малък код, който е прост, лесен, не включва Redis и елиминира всички проблеми, които може да имате с невалидирането на кеша и какво ли още не и няма да губите паметта ви да съдържа едни и същи данни два пъти.
Необходими са ви съставки, за да работи това:
php-fpm
MySQL
иInnoDB
базирани таблици и най-вече - достатъчно RAM и настроенinnodb_buffer_pool_size
променлива. Този контролира колко RAM памет може да задели InnoDB за целите си – колкото по-голяма, толкова по-добре.
Премахнахте Redis от играта, запазихте кода си прост и лесен за поддръжка, не дублирахте данни, не въведохте допълнителна система в играта и оставихте софтуер, който е предназначен да се грижи за данните, да си свърши работата. Доста евтин компромис за максимална полезност, дори ако компилирате целия софтуер от нулата - няма да отнеме повече от час, за да го пуснете и стартирате.
Или можете просто да игнорирате написаното от мен и да потърсите решение с помощта на Redis.