Как получить значение из кеша Symfony без обратного вызова? ⇐ Php
-
Anonymous
Как получить значение из кеша Symfony без обратного вызова?
Ситуация
Я получаю данные из API, который возвращает данные, связанные с продуктом. Данные для нескольких продуктов должны загружаться в одном запросе из соображений производительности. Кроме того, я хочу кэшировать результаты.
Товары могут быть загружены в различных комбинациях. Чтобы предотвратить экспоненциальный рост комбинаций кэша, я хочу кэшировать результаты на уровне продукта.
Намеченная логика
Клиент загружает страницу товара, содержащую 10 товаров. Из этих 10 товаров 6 уже хранятся в кеше. Поэтому вместо того, чтобы запрашивать API для всех 10 продуктов, я хочу отправить только 4 некэшированных идентификатора продуктов.
Когда ответ получен, запись в кэше должна быть добавлена для 4 некэшированных продуктов.
Проблема
Я пытаюсь использовать контракт кэша Symfony \Symfony\Contracts\Cache\CacheInterface. Этот интерфейс имеет только следующий метод получения записей кэша:
/** * Извлекает значение из пула или вычисляет его, если оно не найдено. * * При промахах в кэше вызывается обратный вызов, который должен вернуть недостающее значение. * Этому обратному вызову предоставляется экземпляр PSR-6 CacheItemInterface, соответствующий * запрошенный ключ, который можно использовать, например. для контроля срока годности. Это также могло бы * быть экземпляром ItemInterface, когда необходимы его дополнительные функции. * * @param string $key Ключ элемента, который необходимо получить из кэша. * @param callable|CallbackInterface $callback Должен возвращать вычисленное значение для данного ключа/элемента. * @param float|null $beta Число с плавающей запятой, которое по мере своего роста контролирует вероятность срабатывания. * досрочный срок годности. 0 отключает его, INF вызывает немедленное истечение срока действия. * Значение по умолчанию (или значение null) зависит от реализации, но должно * обычно составляет 1,0, что должно обеспечить оптимальную защиту от давки. * См. https://en.wikipedia.org/wiki/Cache_sta ... expiration. * @param array &$metadata Метаданные кэшированного элемента {@see ItemInterface::getMetadata()} * * @throws InvalidArgumentException Когда $key недействителен или $beta отрицательна */ публичная функция get (строка $key, вызываемый $callback, float $beta = null, массив &$metadata = null): смешанный; Согласно контракту невозможно получить значение кэша без предоставления вызываемого объекта для вычисления значения кэша.
Но это несовместимо с моей предполагаемой логикой. Чтобы определить, какие продукты запрашивать у API, мне сначала нужно получить записи кэша без обратного вызова.
Теоретически я мог бы напрямую использовать классы, реализующие CacheInterface (адаптер), но, на мой взгляд, это очень плохое решение.
Вопрос
Есть ли какие-либо другие решения, кроме использования адаптера напрямую для получения записей кэша без обратного вызова?
Ситуация
Я получаю данные из API, который возвращает данные, связанные с продуктом. Данные для нескольких продуктов должны загружаться в одном запросе из соображений производительности. Кроме того, я хочу кэшировать результаты.
Товары могут быть загружены в различных комбинациях. Чтобы предотвратить экспоненциальный рост комбинаций кэша, я хочу кэшировать результаты на уровне продукта.
Намеченная логика
Клиент загружает страницу товара, содержащую 10 товаров. Из этих 10 товаров 6 уже хранятся в кеше. Поэтому вместо того, чтобы запрашивать API для всех 10 продуктов, я хочу отправить только 4 некэшированных идентификатора продуктов.
Когда ответ получен, запись в кэше должна быть добавлена для 4 некэшированных продуктов.
Проблема
Я пытаюсь использовать контракт кэша Symfony \Symfony\Contracts\Cache\CacheInterface. Этот интерфейс имеет только следующий метод получения записей кэша:
/** * Извлекает значение из пула или вычисляет его, если оно не найдено. * * При промахах в кэше вызывается обратный вызов, который должен вернуть недостающее значение. * Этому обратному вызову предоставляется экземпляр PSR-6 CacheItemInterface, соответствующий * запрошенный ключ, который можно использовать, например. для контроля срока годности. Это также могло бы * быть экземпляром ItemInterface, когда необходимы его дополнительные функции. * * @param string $key Ключ элемента, который необходимо получить из кэша. * @param callable|CallbackInterface $callback Должен возвращать вычисленное значение для данного ключа/элемента. * @param float|null $beta Число с плавающей запятой, которое по мере своего роста контролирует вероятность срабатывания. * досрочный срок годности. 0 отключает его, INF вызывает немедленное истечение срока действия. * Значение по умолчанию (или значение null) зависит от реализации, но должно * обычно составляет 1,0, что должно обеспечить оптимальную защиту от давки. * См. https://en.wikipedia.org/wiki/Cache_sta ... expiration. * @param array &$metadata Метаданные кэшированного элемента {@see ItemInterface::getMetadata()} * * @throws InvalidArgumentException Когда $key недействителен или $beta отрицательна */ публичная функция get (строка $key, вызываемый $callback, float $beta = null, массив &$metadata = null): смешанный; Согласно контракту невозможно получить значение кэша без предоставления вызываемого объекта для вычисления значения кэша.
Но это несовместимо с моей предполагаемой логикой. Чтобы определить, какие продукты запрашивать у API, мне сначала нужно получить записи кэша без обратного вызова.
Теоретически я мог бы напрямую использовать классы, реализующие CacheInterface (адаптер), но, на мой взгляд, это очень плохое решение.
Вопрос
Есть ли какие-либо другие решения, кроме использования адаптера напрямую для получения записей кэша без обратного вызова?
Мобильная версия