Внедрение кеширования результата отчёта

Добавьте декоратор Analyst с PSR-16-кешем: при попадании вернуть Report, при промахе сгенерировать и сохранить на 600 секунд. Ключ строится из полного содержания спецификации.

Короткий ответ

Что ответить на собеседовании

Добавьте декоратор Analyst с PSR-16-кешем: при попадании вернуть Report, при промахе сгенерировать и сохранить на 600 секунд. Ключ строится из полного содержания спецификации.

Подробный разбор

Ответ с пояснениями

Условие

В имеющемся коде реализовано формирование отчёта согласно заданной спецификации. Требуется добавить кэширование получаемого отчёта сроком в 10 минут, используя интерфейс кеша из стандарта PSR‑16 (https://www.php-fig.org/psr/psr-16/#21-cacheinterface).

namespace MyApplication;

final readonly class ReportSpecification
{
    // какие‑то свойства, определяющие содержание отчёта
}

final readonly class Report
{
    // какие‑то свойства с данными отчёта
}

interface Analyst
{
    public function generateReport(ReportSpecification $criteria): Report;
}

final class PostgresAnalyst implements Analyst
{
    public function generateReport(ReportSpecification $criteria): Report
    {
        // тяжёлые запросы с join‑ами и агрегациями

        return new Report(/* данные отчёта */);
    }
}

Ответ

Добавьте декоратор Analyst с PSR-16-кешем: при попадании вернуть Report, при промахе сгенерировать и сохранить на 600 секунд. Ключ строится из полного содержания спецификации.

final class CachedAnalyst implements Analyst {
    public function __construct(
        private Analyst $inner,
        private \Psr\SimpleCache\CacheInterface $cache,
        private \Closure $keyFor,
    ) {}
    public function generateReport(ReportSpecification $criteria): Report {
        $key = 'report.' . hash('sha256', ($this->keyFor)($criteria));
        $cached = $this->cache->get($key);
        if ($cached instanceof Report) return $cached;
        $report = $this->inner->generateReport($criteria);
        $this->cache->set($key, $report, 600);
        return $report;
    }
}

keyFor должен возвращать каноническую строку со всеми параметрами, включая tenant и права, если они влияют на отчёт. PSR-16 не задаёт распределённую блокировку; защиту от stampede добавляют отдельно. Ошибка записи кеша не должна превращать успешно сформированный отчёт в потерянный результат без явной необходимости.

Источник: www.php-fig.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее