Страницы

Поиск по вопросам

вторник, 12 марта 2019 г.

Круговой буфер в системах кэширования

Скажите, а есть ли механизм в PHP и в одной из систем кэширования, используя который можно назначить максимальное количество записей и разные типы поведений для блоков где они хранятся? Приведу пример - есть данные которые нужно сохранять после окончания работы на определенное время (скажем до 10 минут), но нужно добавить контроль того сколько «мест» (скажем, до 1000) выделяется под эти данные и на какое время. Также нужно учесть что есть разные типы данных (конечное число около 25-20) и сделать круговой кэш для каждого типа. В memcache так можно сделать храня заголовок о данных в отдельном блоке, но есть ли плагины или расширения с таким функционалом?
Опять же факт что тип данных по размеру будет фиксированный, так что если есть решения для переиспользования выделенной памяти для уменьшения фрагментации памяти то это ещё один большой плюс.


Ответ

Memcache работает эталонно быстро - там нечего оптимизировать. Единственное на что можно пожаловаться в плане производительности - это время подключения к мемкеш-серверу: но при проблемах ускорение делается с помощью прямых рук сисадмина.
Также нужно учесть что есть разные типы данных (конечное число около 25-20)
А почему бы вопрос преобразования типов данных и "заталкивания чего-угодно в кеш" не назначить на сервис внутри PHP-кода? Как правило, всё что выходит за рамки int и string хранят в JSON-е, а уже прослойка через которую идёт кеширование(есть например в любом PHP фреймворке ) - отдаёт вам сразу всё в нужном формате. Чем такой подход не устраивает?
а есть ли механизм в PHP и в одной из систем кэширования, используя который можно назначить максимальное количество записей и разные типы поведений для блоков где они хранятся?
Всё это регулируется "прослойками кеша" , например Zend\Cache или yii\caching . Вы можете написать свой класс-адаптер, или трейт, который расширяет существующий класс во фреймворке: который добавляет требуемое вам поведение. При чём один адаптер может использовать сразу несколько бекендов кеша (под бекендом я имею ввиду сервис кеша - memcache, sql, tarantool, file, apc, ...).
Например там где требуется "безразмерный" кеш не падающий при перезагрузке и есть админ - tarantool, sql - где нет админа, там где требуется небольшой объём - memcache, где не требуется масштабирование и нужна простота методом топора file . Так можно добиться любой производительности, вне зависимости от форматов данных в кеше - скорее тут факторы другие.
Потери производительности от некой "эталонной производительности кешированаия", если и будут - то явно не от фрагментации памяти. Напомню - что memcache, это сервис, общение с которым происходит через TCP : то есть к нему надо подключаться, тратить время на сетевой цикл принятия-отправки пакетов, собирать пакеты, и другие свойства TCP, если мемкеш-сервер отделён от сервера выполнения - это ещё и сетевые ожидания. Всё это на порядок больше съест тактов процессора, чем затраты самого мемкеша на извлечение фрагментированных данных.
Плюс сервис он на то и сервис, что берёт на себя вопрос оптимизации и хранения ваших данных - вам об этом думать не надо. Если только не хотите написать свой "самый лучший" сервис кеша: но это уже будет совсем другой вопрос. Затраты на преобразование форматов будут, да. Но они будут в любом случае - как с бубном не пляши.
И главное помнить, что процессорные мощности машин стоят обычно копейки по сравнению со стоимостью времени, которое программисты убивают чтобы достичь идеальной производительности под свою задачу :)

Комментариев нет:

Отправить комментарий