Добавьте декоратор 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.