ibolit / cacher
Hierarchical cache manager
Requires
- php: >=7.1
- ext-redis: *
This package is auto-updated.
Last update: 2024-07-22 18:52:01 UTC
README
Элементы кэша и зависимости между ними
Название кэша - уникальное имя, идентифицирующее данный тип кэша. При построении ключа кэширования к имени добавляется уникальный идентификатор пользователя и ряд статических префиксов.
Элемент кэша - порция данных в текстовом, обычно в json-формате. Но может содержать произвольный массив данных (STRING в Redis binary safe!).
Элементы кэша могут быть персонализированные(относящиеся к конкретному пользователю) или общими.
Зависимость - необходимость инвалидации некоторых других кэшей данного пользователя.
Для хранения справочников зависимостей используются отдельные контейнеры, реализованные в виде элементов типа SET для каждого типа кэша.
Структура ключей
dict:dep:
elem:
где
Каждый элемент является ассоциативным массивом(HASH / MAP), имеющий 4 элемента:
data - кэшируемые данные
created_at - дата создания в формате UNIXTIME
hit_count - количество обращений к элементу
last_hit - дата последнего обращения (необходима для алгоритма асинхронного garbage collector)
expires_at - дата, до которой действителен данный кэш
Структура классов библиотеки
Библиотека включает в себя 4 класса:
CacheManager - высокоуровневая оболочка, реализующая логики кэширования и инвалидации, создания имен ключей и другие операции.
CacheDriver - абстрактный класс, представляющий собой интерфейс для реализации низкоуровневых операций с конкретной системой хранения кэшей
RedisCacheDriver - наследник CacheDriver, реализующий операции кэширования на базе библиотеки phpredis.
CacheElemVO - класс, реализующий паттерн ValueObject для обмена данными между подсистемами библиотеки
Примеры использования
Создание экземпляра CacheManager
>$cmInstance = new CacheManager(new RedisCacheDriver('test:', '127.0.0.1',''));
Создание 100000 персонализированных кэш-элементов с использованием экземпляра CacheElemVO
>$vo1 = new CacheElemVO();
>for($i = 0;$i<100000;$i++){
$vo1->setName("simpl".$i);
$vo1->setUid(1000+$i);
$vo1->setCacheData('y1213ertyer'.$i);
$vo1->setExpired(time() + 86400);
$cmInstance->set($vo);
>}
Получение закэшированного элемента
>$vo2 = new CacheElemVO();
>$vo2->setName("simpl10000”);
>$vo2->setUid(11000);
>$data = $cmInstance->get($vo2);
Добавление зависимости
>$v3 = new CacheElemVO();
>$v3->setName("simp534534");
>$cmInstance->setDependency($vo, $v1);
Запуск асинхронного инвалидатора
>$cmInstance->invalidateByTime(CacheManager::KEY_ELEM_PREFIX.
CacheManager::KEY_DIVIDER.'*' ;)