Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ? / 16 сообщений из 16, страница 1 из 1
11.09.2020, 17:45
    #39997735
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Задача заключается в организации файлового кэша, который будет содержать следующие данные:
1) готовые для использования результаты выполнения запросов из БД
2) готовые html-фрагменты, из которых состоят отдаваемые клиенту html-страницы

Исходные данные :
1) Большинство файлов имеют малый размер (от 32 байт до 2 КБ)
2) Суммарный объём таких кэш-данных в 100500 раз превышает объём оперативной памяти.
3) Неактуальные (старые и/или редко используемые) кэш-файлы периодически удаляются служебным скриптом по крону.
4) Каждый кэш-файл должен сопровождаться моментом времени, после которого данные считаются неактуальными
5) Вопрос количества inode держится под контролем
6) ОС семейства Linux

Вариант 1
Обычный текстовый файл, содержащий json-кодированную строку (в режиме JSON_UNESCAPED_UNICODE). Сериализация не рассматривается, т.к. сериализованные данные занимают больше места.

В этом варианте имеются следующие недостатки:
- для реализации учёта периода актуальности кэш-данных все сохраняемые данные придётся оформлять массивом, в котором первое поле хранит момент timestamp
- такие текстовые файлы будет невозможно скормить opcache

Вариант 2
Данные хранятся в php-файлах вида:
Код: php
1.
<?php return ... ;

или
Код: php
1.
<?php return (time() >= 1296630171)? null: ...;

Плюс данного варианта - возможность скормить часть таких кэш-файлов opcache

Вопросы :
1) какой вариант предпочтительнее ? С учётом вышеизложенных исходных данных. Нужно, чтобы было быстро и компактно.
В случае с текстовыми файлами необходимо выполнять json-декодирование, в случае с php-фалами - выполнять php-код.

2) имеет ли смысл скармливать часть php-кэш-файлов opcache ? С одной стороны, ОС и так кэширует файлы, но с другой стороны, файловый кэш ОС может быть занят другими файлами, тогда как использование opcache даёт определённые гарантии, что в указанном объёме php-файлы будут содержаться в кэше opcache.
...
Рейтинг: 0 / 0
11.09.2020, 17:54
    #39997742
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
авторимеет ли смысл скармливать часть php-кэш-файлов opcache
авторСуммарный объём таких кэш-данных в 100500 раз превышает объём оперативной памяти.
...
Рейтинг: 0 / 0
11.09.2020, 18:37
    #39997764
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
ScareCrow
авторимеет ли смысл скармливать часть php-кэш-файлов opcache
авторСуммарный объём таких кэш-данных в 100500 раз превышает объём оперативной памяти.
Самые часто используемые php-кэш-файлы почти всё время будут в кэше opcache
...
Рейтинг: 0 / 0
16.09.2020, 00:30
    #39999096
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Если исходить из того, что большинство кэш-файлов будут иметь размер менее 4 Кб (размер блока), то размер файлов уходит на 2-й план. Соответственно, на первое место выходит скорость чтения кэш-данных, а это уже тестированием... Впрочем возможность использования opcache для части таких кэш-файлов тоже имеет важное значение...
...
Рейтинг: 0 / 0
16.09.2020, 10:07
    #39999212
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
в память класть и не париться
удалятся и обновятся сами
...
Рейтинг: 0 / 0
16.09.2020, 14:51
    #39999357
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Алексей Роза 2020
в память класть и не париться
удалятся и обновятся сами

Имеете ввиду shmem или opcache ?
...
Рейтинг: 0 / 0
16.09.2020, 15:07
    #39999366
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
в opcache он сам положит
redis
и кешируйте там только что-то реально тяжёлое, типа count(*)
...
Рейтинг: 0 / 0
16.09.2020, 20:37
    #39999545
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
авторв opcache он сам положит"он" - это кто? redis? redis с opcache не работает...

Если сравнивать варианты (php-кэш-файлы + opcache) и (redis), то первый вариант имеет огромное преимущество в том плане, что формируется полноценный файловый кэш (размер которого в 100500 раз больше объёма оперативной памяти). В случае с redis кэшировать будет возможно только малую часть кэш-данных.

Здесь оптимальной видится токая логика :
1 ) Если в результате тестов окажется, что чтение/парсинг текстовых файлов работает быстрее, чем подключение php-файлов, то можно реализовать двойное кэширование: все данные, передаваемые на вход кэшеру, в обязательном порядке кэшируются в текстовых файлах + малая их часть дополнительно кэшируется в redis или в shmop .
2 ) Если в результате тестов окажется, что чтение/парсинг текстовых файлов работает медленнее, чем подключение php-файлов, то напрашивается вариант (php-кэш-файлы + opcache)
...
Рейтинг: 0 / 0
16.09.2020, 22:38
    #39999585
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
...
Рейтинг: 0 / 0
17.09.2020, 02:36
    #39999609
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Алексей Роза 2020
Поржатьхохотать иногда полезно. Так что, присоединяюсь

По сабжу. Учитывая, что в Redis предусмотрены политики вытеснения старых данных " maxmemory-policy ", то в случае ипользования Redis необходимость в собственном "чистильщике" старого кэша отпадает. Но вопрос использования файлового кэша по-прежнему сохраняется, т.к. в оперативной памяти уместится только самый часто используемый кэш. Тогда как не самый часто используемый кэш тоже где-то нужно хранить.
...
Рейтинг: 0 / 0
17.09.2020, 02:37
    #39999610
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Вы так и не ответили, кто такой "он". Который сам "ложит" (от вашей фразы какие-то ассоциации возникают нехорошие)
...
Рейтинг: 0 / 0
17.09.2020, 09:35
    #39999639
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
да PHP, кто ещё, opcache же в PHP.
в частности PHP-FPM.
Cyrax_02
Тогда как не самый часто используемый кэш тоже где-то нужно хранить.

ага, в виде файлов, которые потом склеивать. Возвращение годзилы SSI
...
Рейтинг: 0 / 0
17.09.2020, 11:59
    #39999727
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Алексей Роза 2020
ага, в виде файлов, которые потом склеивать. Возвращение годзилы SSI

Считывание из файлов 10-20-30 готовых фрагментов HTML-кода с SSD-диска выполняется в 10-100 раз быстрее, чем выполнение запроса к БД и оформление полученных данных в HTML. Проверено.

Посему вопрос про хранение не самого часто используемого кэша остаётся в силе. К тому, же такой кэш содержит не только готовый HTML-код, но и результаты выполнения запросов к БД.
...
Рейтинг: 0 / 0
17.09.2020, 12:12
    #39999736
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Cyrax_02
4) Каждый кэш-файл должен сопровождаться моментом времени, после которого данные считаются неактуальными

Этим моментом может быть атрибут файла (например дата изменения).
Тогда в самом файле не нужно хранить посторонних данных. Это будет либо статичный текст, либо html-текст с динамическими вставками.
...
Рейтинг: 0 / 0
17.09.2020, 15:31
    #39999898
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
Cyrax_02
Считывание из файлов 10-20-30 готовых фрагментов HTML-кода с SSD-диска выполняется в 10-100 раз быстрее, чем выполнение запроса к БД и оформление полученных данных в HTML. Проверено.

редиска для этого как раз
ну раз нет памяти, делайте что-то вроде:
Код: php
1.
2.
3.
4.
5.
6.
7.
$html = '';
if (file_exists("my_cache.php") && время_файла < X)
{
    $html = include "my_cache.php";
} else {
    $html = сходить_в_БД;
}
...
Рейтинг: 0 / 0
18.09.2020, 01:44
    #40000099
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ?
авторЭтим моментом может быть атрибут файла (например дата изменения).
Тогда в самом файле не нужно хранить посторонних данных. Это будет либо статичный текст, либо html-текст с динамическими вставками.
Если фиксироваться будет момент времени, начиная с которого данные считаются устаревшими, то дата изменения задачу не решит. Если же фиксироваться будет период времени, в течение которого данные считаются актуальными, то дата изменения решит задачу только в том случае, если такие периоды для всех кэш файлов (или для групп/наборов кэш-файлов) одинаковы. В моём же случае время жизни разное для всех кэш файлов (даже из одной группы/набора). Т.е. в моём случае дата изменения не поможет и в случае реализации кэша на текстовых файлах всё равно придётся сохранять упакованные массивы с датой. Впрочем, большинство кэш-файлов и так будут содержать массивы данных, поэтому добавление одного короткого поля с датой в такие массивы на производительности вряд ли скажется сколь-нибудь заметно.

авторну раз нет памяти, делайте что-то вроде: ...Это и есть вариант №2 в начале темы. Память есть, но её мало. А данных много.
В данном случае возможен такой вариант:

1 . Для кэширования используется одновременно и Redis, и файловая система
2 . Перед сохранением в Redis данные сжимаются (например, с помощью gzencode ), при извлечении - разжимаются
3 . Если "maxmemory" не превышает 4Gb, то Redis устанавливается 32-битный - согласно рекомендации из официальной документации:
https://redis.io/topics/memory-optimization Redis compiled with 32 bit target uses a lot less memory per key , since pointers are small, but such an instance will be limited to 4 GB of maximum memory usage. To compile Redis as 32 bit binary use make 32bit. RDB and AOF files are compatible between 32 bit and 64 bit instances (and between little and big endian of course) so you can switch from 32 to 64 bit, or the contrary, without problems.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Файловый кэш - в текстовой форме или в форме подключаемых php-файлов ? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]