Объекты кеша
Дата обновления перевода 2024-06-14
Объекты кеша
Объекты кеша - это информационные единицы, которые хранятся в кеше в виде пары ключ/значение. В компоненте Cache они представлены классом CacheItem. Они используются как в контрактах кеша, так и в интерфейсах PSR-6.
Ключи и значения объектов кеша
Ключ объекта кеша - это простая строка, которая действует так же, как
её идентификатор, поэтому она должна быть уникальна для каждого пула кеша.
Вы можете свободно выбирать ключи, но они должны содержать только буквы
(A-Z, a-z), цифры (0-9) и символы _
и .
. Другие распространённые
символы (вроде {
, }
, (
, )
, /
, \
и @
) зарезервированы
стандартом PSR-6 для дальнейшего использованияй.
Значение объекта кеша может быть любыми данными, представленными типом, который можно сериализировать PHP, например, обычными типами (строка, число, булево значение, null), массивами и объектами.
Создание объектов кеша
Объекты кеша создаются с помощью метода getItem($key)
пула кеша. Аргументом
является ключ объекта:
1 2 3 4
// объект пула $cache был создан ранее
$productsCount = $cache->get('stats.products_count', function (ItemInterface $item): string {
// [...]
});
При использовании PSR-6 они создаются с помощью метода getItem($key)
пула кеша:
1 2
// объект пула $cache был создан ранее
$productsCount = $cache->getItem('stats.products_count');
Далее, используйте метод Psr
, чтобы установить
данные, хранящиеся в объекте кеша:
1 2 3 4 5 6 7 8 9 10
// сохранение простого числа
$productsCount->set(4711);
$cache->save($productsCount);
// сохранение массива
$productsCount->set(array(
'category1' => 4711,
'category2' => 2387,
));
$cache->save($productsCount);
Ключ и значение любого заданного объекта кеша можно получить с помощью соответствующих методов геттера:
1 2 3 4
$cacheItem = $cache->getItem('exchange_rate');
// ...
$key = $cacheItem->getKey();
$value = $cacheItem->get();
Срок действия объекта кеща
По умолчанию, объекты кеша хранятся постоянно. На практике, это "постоянное хранение" может сильно отличаться, в зависимости от используемого типа кеша, как объясняется в статье Пулы кеша и поддерживаемые адаптеры.
Однако, в некоторых приложениях распространено использование объектов кеша
с более коротким жизненным циклом. Рассмотрите, к примеру, приложение, которое
кеширует последние новости только на одну минуту. В таких случаях, используйте
метод expiresAfter()
, чтобы установить количество секунд для кеширования
объекта:
1 2 3 4
$latestNews->expiresAfter(60); // 60 seconds = 1 minute
// этот метод также принимает экземпляры \DateInterval
$latestNews->expiresAfter(DateInterval::createFromDateString('1 hour'));
Объекты кеша определяют другой связанный метод под названием expiresAt()
,
чтобы установить точную дату и время истечения срока действия объекта:
1
$mostPopularNews->expiresAt(new \DateTime('tomorrow'));
Попадания и промахи в объекты кеша
Использование механизма кеша важно для улучшения производительности приложения, но не должно быть обязательным для работы приложения. На самомделе, стандарт PSR-6 указывает, что ошибки кеширования не должны приводить к ошибкам приложения.
На практике это означает, что метод getItem()
всегда возвращает объект, реализующий
интерфейс Psr\Cache\CacheItemInterface
, даже когда объект кеша не существует.
Следовательно, вам не нужно разбиираться с возвратными значениями null
и вы можете
беопасно сохранять значения кеша, вроде false
и null
.
Для того, чтобы решить, правильный ли возвращённый объект, кеши используют концепт попаданий и промахов:
- Кеш-попадания возникают, когда запрошенный объект найден в кеше, его значение не повереждено или нвалидно, и он не просрочен;
- Кеш-промахи являются противоположностью попаданий, поэтому они возникают, когда объект не найден в кеше, его значение повреждено или инвалидно по какой- либо причине, или же объект просрочен.
Единицы объектов кеша определяют булев метод isHit()
, который возвращает
true
для кеш-попаданий:
1 2 3 4 5 6 7 8 9
$latestNews = $cache->getItem('latest_news');
if (!$latestNews->isHit()) {
// провести сложные вычисления
$news = ...;
$cache->save($latestNews->set($news));
} else {
$news = $latestNews->get();
}