Должен ли я использовать динамические переменные в тегах кеша?
-
29-09-2020 - |
Вопрос
TL;DR
Могут ли/должны ли кэшироваться теги в Magento быть динамическими?
Задний план
Я создаю интеграцию CMS из внешней CMS в Magento.Данные хранятся в Elasticsearch в AWS.У меня есть собственный контроллер, на который перезаписывается URL-адрес страницы, который использует URL-адрес в качестве ключа и загружает данные из созданного мной пользовательского блока с именем content/dynamic
.
Теперь я хочу добавить к нему блочное кэширование.
Я знаю, что соответствующие настройки здесь — это теги кеша и ключ кеша.
Я думаю использовать Mage_Cms_Model_Block::CACHE_TAG
, а также хранилище в качестве базовых тегов кеша, а затем добавить собственный тег кеша, например Me_Content_Model_Dynamic::CACHE_TAG
, и соответствующую запись <global><cache><types>
для этого, чтобы я мог очистить весь кешированный динамический контент с экрана управления кешем в администраторе Magento..
Одна из функций, которую мне нужно реализовать, — это иметь возможность обновлять кэши контента для блока content/dynamic
для конкретной страницы CMS, а также любые блоки контента под ним.
Особенности
Я думаю о добавлении еще одного динамического тега кеша, например dynamic_content_hashofURLhere
, к каждому экземпляру страницы content/dynamic
и всем его дочерним блокам, чтобы я мог легко идентифицировать записи кэша динамической страницы для всего контента, относящегося к определенной странице.
Вопрос
Это правильный способ использования тегов кеша?
Мне кажется, это простой способ настроить таргетинг и сделать недействительными записи кеша блоков для страницы на целую страницу (независимо от того, сколько их) без необходимости создавать ключ кеша для каждого блока контента на странице и аннулировать их по отдельности..
Используются ли теги динамического кеша в кодовой базе Magento?
Это лучшая практика?
Для ясности: я не хочу очищать теги динамического кеша на странице управления кешем.Я хотел бы сделать это программно.На странице управления кешем я бы выбрал только статический тег кеша, который я добавляю отдельно от этого динамического.
Решение
Могут ли/должны ли кэш-теги в Magento быть динамическими?... Это правильный способ использования тегов кеша?
Да!Именно для этого и нужны теги кеша — чтобы сгруппировать несколько записей кеша вместе.
Вот несколько цитат из разных блогов:
Теги кеша существуют для того, чтобы мы могли выборочно очищать экземпляры кеша.
Источник: Эрфан Эмани
$data
, хранящиеся в кеше, также могут быть помечены метаданными.Это позволяет логически группировать записи кэша для массового удаления.
Источник: Ник Джонс
Предположительно наличие динамических тегов кеша означает, что вы можете получить сотни или тысячи тегов кеша в своем хранилище кеша.Независимо от того, влияет ли это на производительность из-за отсутствия этих тегов кеша, вероятно, потребуется некоторое сравнение производительности, однако теоретически это не должно приводить к большим накладным расходам, поскольку теги кеша не запрашиваются, если они не очищены для удаления.
Предполагая, что тег динамического кеша закончился как dynamic_content_HISUDFHS8y92333
, вы можете легко очистить все записи кэша блока контента для страницы HISUDFHS8y92333
следующим образом:
/** @var Mage_Core_Model_Cache $cache */
$cache = Mage::app()->getCacheInstance();
$cache->clean(array(Me_Content_Model_Dynamic::CACHE_TAG . '_HISUDFHS8y92333'));
Используются ли теги динамического кеша в кодовой базе Magento?
да.
Для быстрого примера вы можете взглянуть на Mage_Core_Block_Abstract::addModelTags()
:
# File: app/code/core/Mage/Core/Block/Abstract.php
public function addModelTags(Mage_Core_Model_Abstract $model)
{
$cacheTags = $model->getCacheIdTags();
if (false !== $cacheTags) {
$this->addCacheTag($cacheTags);
}
return $this;
}
Если вы изучите Mage_Core_Model_Abstract::getCacheIdTags
, вы увидите, что он возвращает массив тегов кеша существующей модели с идентификатором модели, добавленным в конец :
# File: app/code/core/Mage/Core/Model/Abstract.php
public function getCacheIdTags()
{
$tags = false;
if ($this->getId() && $this->_cacheTag) {
$tags = array();
if (is_array($this->_cacheTag)) {
foreach ($this->_cacheTag as $_tag) {
$tags[] = $_tag.'_'.$this->getId();
}
} else {
$tags[] = $this->_cacheTag.'_'.$this->getId();
}
}
return $tags;
}
Этот метод вызывается Mage_Core_Model_Abstract::getCacheTags
, что означает, что теги динамического кеша используются в любой модели Magento (которая простирается от абстрактной базовой модели), в которой разрешено кэширование.
Это лучшая практика?
Да, конечно.Это намного лучше, чем искать в кэш-хранилище ключи, соответствующие определенному шаблону, просто чтобы удалить их все.