Вопрос или проблема
Мой плагин будет обрабатывать большие объемы данных, которые могут привести к чтению более 5000 элементов в запросе к базе данных. Администратор предоставит набор CSV-файлов, которые будут храниться/организовываться в базе данных. Пользователь получит некоторые общие результаты, когда он перейдет на определенные страницы. Я могу предсказать, каким будет этот запрос в большинстве случаев. Я хотел сохранить массив результатов в кэше, чтобы запрос проходил быстрее.
Я изучал wp_cache_get, wp_cache_set, wp_cache_delete
и т. д., но это, похоже, не лучший вариант, поскольку он не является постоянным. Кодекс говорит, что мне понадобится дополнительный плагин для работы с постоянным кэшированием, но я предпочел бы не требовать ЕЩЕ ОДИН плагин. Я мог бы хранить массив сериализованным в базе данных, но не уверен, является ли это лучшим вариантом с точки зрения эффективности или даже приемлемым обходным решением проблемы кэширования.
Кэширование – ваш друг
Я понимаю ваше разочарование в добавлении еще одного плагина, но метод расширения кэширования WordPress настоятельно рекомендуется для любых сайтов WordPress, получающих какой-либо трафик. Эти плагины позволяют WordPress хранить кэш в месте, более подходящем для хранения и быстрого доступа к этим данным, таким как Memcache, Redis или даже в локальной файловой структуре.
- W3 Total Cache предлагает самый широкий выбор мест для хранения кэша.
- WP Super Cache обеспечивает очень быстрый доступ к файловому кэшу.
- Batcache предлагает прямой доступ к Memcache.
- Redis Cache предлагает прямой доступ к кэшу Redis.
В конечном итоге, все зависит от того, что доступно на вашем сервере.
На мой взгляд, wp_cache
— это то, что вам нужно. Это позволит вам хранить эти значения для быстрого доступа позже, используя намного более быструю технологию, чем хранение их в базе данных.
Мой плагин будет обрабатывать большие объемы данных, которые могут привести к чтению более 5000 элементов в запросе к базе данных.
Если ваши строки небольшие, а таблицы правильно индексированы, это может не быть проблемой.
Тем не менее, пока вы на самом деле не измерили это и не нашли проблему, я считаю это преждевременным.
Я изучал
wp_cache_get
,wp_cache_set
,wp_cache_delete
и т. д., но это, похоже, не лучший вариант, поскольку он не является постоянным.
С помощью объекта кэширования и правильного программного обеспечения это может и будет постоянным. Обычно это происходит на правильном корпоративном хостинге или если вы управляете собственным сервером, иногда на управляемых хостингах через Redis/Memcached/APCu.
Плагины кэширования также могут это делать, хотя вам следует измерить производительность, так как иногда файловые кэши медленнее, а не быстрее.
Но даже если он не постоянный, вам все равно следует рассмотреть их как средство предотвращения дублированных запросов. Вызов get_post_meta
10 раз подряд с одинаковыми аргументами не создаст 10 запросов, потому что он использует WP_Cache
за кулисами через эти функции.
И если у вас есть сомнения, всегда есть временные данные, которые хранятся во временных опциях.
Ответ или решение
Для оптимизации запросов к базе данных в вашем плагине, который обрабатывает большие объемы данных, а также для повышения производительности при частом обращении к результатам, рекомендуется использовать несколько подходов к кэшированию.
1. Оценка производительности
Прежде всего, важно провести оценку производительности ваших запросов. Если вы работаете с таблицами, которые хорошо индексированы и имеют небольшие строки, возможно, вы не столкнетесь с проблемами производительности даже при доступе к 5000 и более записям. Тем не менее, если вы заметите ухудшение работы, переход к кэшированию станет логичным шагом.
2. Использование кэширования WordPress
WordPress предоставляет функции кэширования, такие как wp_cache_get
, wp_cache_set
и wp_cache_delete
, которые позволяют временно сохранять данные в оперативной памяти. Однако, как вы правильно заметили, без установки дополнительных плагинов это кэширование не является постоянным. Но даже для временного кэширования есть свои преимущества и оно снизит нагрузку на базу данных, избегая дублирующихся запросов.
Кэширование объектов
Если вы можете использовать расширение для кэширования объектов (например, Redis или Memcached), вам будет доступно постоянное кэширование. Это особенно эффективно на серверах с правильной конфигурацией или на управляемых хостингах, где поддерживаются подобные технологии. Кэширование объектов обеспечит вам значительное ускорение запросов.
3. Плагины кэширования
Хотя вы упомянули нежелание использовать дополнительные плагины, я настоятельно рекомендую рассмотреть их. Вот несколько популярных решений:
- W3 Total Cache – поддерживает разнообразные системы хранения кэша.
- WP Super Cache – предлагает быстрый доступ к файловому кэшу.
- Redis Cache – предоставляет доступ к кэшу Redis.
Эти плагины могут значительно повысить производительность вашего сайта.
4. Использование временных данных
Кроме всего прочего, для хранения временных или временных данных вы можете рассмотреть использование транзиентов. Это отличный способ хранения данных с истечением срока действия в таблице options
вашей базы данных. Транзиенты позволяют управлять кэшированием, устанавливая время жизни, после которого данные автоматически удаляются.
5. Хранение сериализованных данных в базе
Если у вас есть определённые наборы данных, которые часто используются и не изменяются, вы можете сериализовать эти данные и хранить их в базе данных. Однако, такой подход может быть менее эффективным, чем использование кэширования памяти, поскольку доступ к базе данных – это всё равно более медленный процесс по сравнению с доступом к оперативной памяти.
Заключение
В заключение, комбинирование технологий кэширования, таких как использование кэширования объектов, возможность интеграции плагинов и применения временных данных через транзиенты поможет вам оптимизировать ваши запросы к базе данных. Исходя из ваших потребностей и серверного окружения, выберите наиболее подходящий для вас метод, чтобы обеспечить максимальную производительность вашего плагина.