ibolit/cacher

This package is abandoned and no longer maintained. No replacement package was suggested.
There is no license information available for the latest version (1.0.6) of this package.

Hierarchical cache manager

1.0.6 2020-12-16 12:12 UTC

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.'*'
                           ;)