Вопрос по файловому кешированию

12
S5
На сайте с 04.01.2010
Offline
77
1020

Доброго времени суток! На примере опенкарта хочу понять принцип работы файлового кеширования для шаблонов. Вопрос в следующем - opencart сам по себе очень тяжел и дает нехилую нагрузку на базу, от части это связано с тем, что изза мультиязычности в одном запросе используется до двух десятков LEFT JOIN-ов. Но в тоже время он не тормозит, что позволяет предположить(ну и опыт подсказывает), что у него хорошее файловое кеширование, и лишний раз бд не дергается.

Вопрос - как организовано кеширование и как понимать когда это кеширование сбрасывать, а когда оно ещё октуально. Первое что приходит в голову - держать сохраненный блок контента в текстовом файле, и от него считать md5 и сверять его с ключевым md5 из базы для конкретной страницы. При обновлении позиции\категории просто этот md5 сбрасывать. Но тут есть ньюансы вроде пагинации, различного вида сортировок (убывание\возрастание цены\названия).

Вопрос номер два - какие эффективные виды кеширования (кроме мемкеша) актуальны на данный момент и в чем их плюсы\минусы. Если приведете аргументы в плоскости интернет-магазинов будет вообще замечательно. Спасибо :)

LEOnidUKG
На сайте с 25.11.2006
Offline
1753
#1

а разве у opencart нет своего кэширования? был же!

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
TF-Studio
На сайте с 17.08.2010
Offline
334
#2

Вопрос кеширования - слишком сложный, чтобы описать все нюансы в 1 посте.

Кешировать можно html-код, результаты запросов повторяющихся блоков, результаты поиска, слабые места.

Более конкретно ставьте вопрос.

Для разных задач - подходят разные решения.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
IL
На сайте с 20.04.2007
Offline
435
#3
sg552:
Вопрос - как организовано кеширование и как понимать когда это кеширование сбрасывать, а когда оно ещё октуально.

Инвалидация кэша наряду с именованием переменных...

По поводу различных "сортировок" - их действительно имеет смысл кэшировать?

Быть может, сначала определить узкие места.. что именно создаёт нагрузку?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
A
На сайте с 29.12.2007
Offline
68
#4
sg552:
Вопрос - как организовано кеширование и как понимать когда это кеширование сбрасывать, а когда оно ещё октуально. Первое что приходит в голову - держать сохраненный блок контента в текстовом файле, и от него считать md5 и сверять его с ключевым md5 из базы для конкретной страницы. При обновлении позиции\категории просто этот md5 сбрасывать. Но тут есть ньюансы вроде пагинации, различного вида сортировок (убывание\возрастание цены\названия).

Во-первых, кто Вам сказал, что джоины непременно заставят базу тормозить? Правильное использование ключей спасет в 99.99% случаев. Будь хоть сотня джойнов, при не большом размере таблиц и правильно настроенных индексах - не почувствуете.

Во-вторых, основный принцип кеширования - сохранить часто запрашиваемую, но редко изменяемую информацию. Чаще всего, в кеше сохраняют не фрегменты страниц (хотя и это бывает оправдано), а результаты запросов - меньше весят, проще проверить валидность кеша.

В-третьих, пагинация, сортировки, фильтры и пр. - это отдельные кеши, никак не связанные между собой. Ведь даже по умолчанию все это используется, часто скрыто. Поэтому, решение простое: смотрим все параметры, генерируем ключ и по нему сохраняем (в дальнейшем получаем) данные. Например:

$cache_key = "catalog_{$sort}_{$desc}_{$filter}_{$page}";

Изменился любой параметр - получаем новые ключ и, соответственно, новые данные.

В-четвертых, не обязательно кешировать все и вся. Скорее наоборот - простые запросы лучше не кешировать, из базы часто быстрее получить результат, чем из файла (да и базы на сегодняшний день сами по себе много чего кешируют). И этот момент можно использовать во благо, например сделать систему тегов для файлового кеша...

В-пятых, ... Хотя нет, хватит пока и основ ).

sg552:
Вопрос номер два - какие эффективные виды кеширования (кроме мемкеша) актуальны на данный момент и в чем их плюсы\минусы. Если приведете аргументы в плоскости интернет-магазинов будет вообще замечательно. Спасибо :)

По сути, в этой области ничего нового не придумано и все давно изучено. Есть 2 вида хранения кеша (память, диск) и 2 типа кеша (плоский, структурный), все остальное - их производные. Примеры:

1. Файловый кеш (диск, плоский)

2. Мемкеш, APC (память, плоский)

3. noSQL, mySQL (да-да, mysql тоже можно использовать для кеширования; память/диск, структурный)

По опыту, memcache, на данный момент, самый удобный и практичный.

php.developer
На сайте с 22.11.2010
Offline
94
#5
aktuba:

2. Мемкеш, APC (память, плоский)

Как-то странно, рядом помещать две никак не связанные вещи. Кэш данных и кэш опкода.

---------- Post added 21-09-2012 at 13:22 ----------

UPD. Извиняюсь, данные в APC тоже можно кэшировать, не знал. Спасибо.

S5
На сайте с 04.01.2010
Offline
77
#6
В-пятых, ... Хотя нет, хватит пока и основ ).

Продолжайте, я для этого и создавал топик :)

а разве у opencart нет своего кэширования? был же!

меня интересуют хай лоады впринципе, опенкарт лиш указан для примера

Кешировать можно html-код, результаты запросов повторяющихся блоков, результаты поиска

Как будет происходить инвалидация кеша запроса?

По поводу различных "сортировок" - их действительно имеет смысл кэшировать?

меня интересует сам принцип, хотя идея ниже

$cache_key = "catalog_{$sort}_{$desc}_{$filter}_{$page}";

крутилась в голове, но из неё появляется следующий вопрос - а если добавился новый товар в середину списка с ценами? делать инвалидацию всей категории во всех вхождениях кеша?

Быть может, сначала определить узкие места.. что именно создаёт нагрузку?

это пока теория, хочется не наступать на грабли в будущем

Во-первых, кто Вам сказал, что джоины непременно заставят базу тормозить? Правильное использование ключей спасет в 99.99% случаев. Будь хоть сотня джойнов, при не большом размере таблиц и правильно настроенных индексах - не почувствуете.

При джоине создается виртуальная таблица куда помещаются выбранные данные, хоть это и временно, это несет неудобства в плане потребления ОЗУ. В моем проекте на одной базе будет крутиться десяток проектов, использование множественных LEFT JOIN мне кажется нецелесообразным, т.к. сервер быстро завернется.

Есть 2 вида хранения кеша (память, диск) и 2 типа кеша (плоский, структурный)

Спасибо за направление, буду самообразовываться

По опыту, memcache, на данный момент, самый удобный и практичный.

все с ним хорошо, но при нехватке памяти вытесняются старые данные, соответственно в определенный момент он просто потеряет смысл, т.к. инфа там будет храниться не более n времени

кэш опкода

тоже спасибо, будет время обязательно почитаю, направление интересное

A
На сайте с 29.12.2007
Offline
68
#7
sg552:
меня интересует сам принцип, хотя идея ниже
$cache_key = "catalog_{$sort}_{$desc}_{$filter}_{$page}";
крутилась в голове, но из неё появляется следующий вопрос - а если добавился новый товар в середину списка с ценами? делать инвалидацию всей категории во всех вхождениях кеша?

Нормальная (и единственно правильная) практика: при изменении данных в хранилище - удалить кеш, связанный с этими данными. В Вашем случае - удалить кеш для запросов данного типа. Это будет удобно сделать, если каждый тип кеша скидывать в свою папку.

sg552:
При джоине создается виртуальная таблица куда помещаются выбранные данные, хоть это и временно, это несет неудобства в плане потребления ОЗУ. В моем проекте на одной базе будет крутиться десяток проектов, использование множественных LEFT JOIN мне кажется нецелесообразным, т.к. сервер быстро завернется.

Да ладно? ))) Я, пока что, знаю только один проект, на котором не используются джойны. Но знаю кучу других, на которых джойны используются в полную силу. Есть и цифры: 250-300к уников в сутки на 1-м сервере базы данных. С кучей джойнов.

sg552:
все с ним хорошо, но при нехватке памяти вытесняются старые данные, соответственно в определенный момент он просто потеряет смысл, т.к. инфа там будет храниться не более n времени

Тут все зависит от кривизны рук, если честно. Вообще, это даже хорошо - в кеше только те данные, которые нужны. Да и заполнить 2-4 гига памяти данными из базы - довольно проблематично, если честно. Посчитайте сами: если все данные из базы на 1 товар весят 2-3 кб (а это ОЧЕНЬ МНОГО), то для заполнения 2-х гигов памяти надо 700-1000 ПОПУЛЯРНЫХ товаров, т.е. таких, в которые заходят много разных людей и часто. Реальна ситуация? Думаю нет... А если да - то значит не проблема найти 16-64 гига памяти, т.к. магазин уже ОЧЕНЬ популярный ;).

S5
На сайте с 04.01.2010
Offline
77
#8
Да ладно? ))) Я, пока что, знаю только один проект, на котором не используются джойны. Но знаю кучу других, на которых джойны используются в полную силу. Есть и цифры: 250-300к уников в сутки на 1-м сервере базы данных. С кучей джойнов.

предложите вариант с мультиязычностью для всего. начиная от названий категорий заканчивая названиями различных типов и видов сортировок по определнному параметру для категории. В итоге имеем только для товаров 12-15-20 таблиц с инфой по каждой характеристике и каждому языку.

Я, пока что, знаю только один проект, на котором не используются джойны

Используются не значит лучший вариант, это впринципе самый простой вариант организации полноценной мультиязычности. Но. Без нормального кеширования при 100к+ запросов в день под такую базу прийдется выделять очень нехилые ресурсы, что не есть оптимально

Тут все зависит от кривизны рук, если честно. Вообще, это даже хорошо - в кеше только те данные, которые нужны. Да и заполнить 2-4 гига памяти данными из базы - довольно проблематично, если честно.

и в чем может быть кривизна рук, если у мемкеша аж 4 команды и десяток параметров настройки. Да и 2-4 гига под _только мемкеш_ это ресурсоемко, не кажется

700-1000 ПОПУЛЯРНЫХ товаров

давайте представим что на 1 базе крутится десяток проектов средней популярности\тематики, думаете не набереться и больше? :)

A
На сайте с 29.12.2007
Offline
68
#9
sg552:
предложите вариант с мультиязычностью для всего. начиная от названий категорий заканчивая названиями различных типов и видов сортировок по определнному параметру для категории. В итоге имеем только для товаров 12-15-20 таблиц с инфой по каждой характеристике и каждому языку.

Вынести языковые данные в файлы - APC/eAccelerator поможет в работе.

sg552:
Используются не значит лучший вариант, это впринципе самый простой вариант организации полноценной мультиязычности. Но. Без нормального кеширования при 100к+ запросов в день под такую базу прийдется выделять очень нехилые ресурсы, что не есть оптимально

100к уников в сутки в инет-магазине и нет средств на поддержку ресурса? Ладно, в сторону подобное... По технической части: я не говорил что не нужен кеш, я сказал, что надо кешировать только то, что требуется, а не все подряд.

sg552:
и в чем может быть кривизна рук, если у мемкеша аж 4 команды и десяток параметров настройки. Да и 2-4 гига под _только мемкеш_ это ресурсоемко, не кажется

В реализации, а не в настройках ;). Если хранить вместо данных еще и разметку (а я еще видел как и js+css был в закешированных данных) - вытеснение данных будет идти намного быстрее, верно? 2-4 гига - это мелочь, на сегодняшний день. И поверьте, проще и дешевле поставить 32 гига памяти, чем наглухо оптимизировать скрипт и потом его поддерживать.

sg552:
давайте представим что на 1 базе крутится десяток проектов средней популярности\тематики, думаете не набереться и больше? :)

Думаю, что если есть десяток проектов средней популярности - можно найти деньги и поставить то железо, которое обеспечит комфортную работу не только базе, но и разработчику. А то получается, что хотите выделить по 200-400 метров памяти на каждый проект и требовать адекватной работы от него. Конечно, такое возможно, но маловероятно.

Кстати, при 100к униках и таких сложных требованиях к запросам, есть проще вариант для кеширования: сохранять отдаваемую страницу целиком в файловый кеш на относительно не большое время (1-60 сек) и следующим посетителям отдавать напрямую через apache/nginx, минуя php. Плюсы: минимальное потребление ресурсов, быстрая работа, минимум конфигурации (при использовании nginx - он сам все это может делать, даже код менять не надо).

P.S.: как-то Вы путаетесь в параметрах... то один проект на 100к и кеш для него продумывается, то десяток средних и думаем о расходе ресурсов под них. Разные задачи - разные решения.

S5
На сайте с 04.01.2010
Offline
77
#10

Задача - сделать универсальный движ для 10 интернет-магазинов, и так как это реализация скорей для набить руку и повысить свой уровень, меня интересует вопрос нагрузки. По поводу файлового кеша я и думал как то так организовать, но нужно более детально продумывать, т.к. подобных моментов и узких мест будет множество.

P.S.: как-то Вы путаетесь в параметрах... то один проект на 100к и кеш для него продумывается, то десяток средних и думаем о расходе ресурсов под них. Разные задачи - разные решения.

задача как раз таки одна, так интереснее :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий