ibolit/cacher

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-05-16 19:53:30 UTC


README

Элементы кэша и зависимости между ними

Название кэша - уникальное имя, идентифицирующее данный тип кэша. При построении ключа кэширования к имени добавляется уникальный идентификатор пользователя и ряд статических префиксов.

Элемент кэша - порция данных в текстовом, обычно в json-формате. Но может содержать произвольный массив данных (STRING в Redis binary safe!).

Элементы кэша могут быть персонализированные(относящиеся к конкретному пользователю) или общими.

Зависимость - необходимость инвалидации некоторых других кэшей данного пользователя.

Для хранения справочников зависимостей используются отдельные контейнеры, реализованные в виде элементов типа SET для каждого типа кэша.

Структура ключей

dict:dep: (тип данных SET в Redis) - справочник, представляющий множества имен кэшей, которые необходимо инвалидировать в случае инвалидации целевого кэша, где

elem: (тип данных HASH в Redis) - элемент кэширования с опциональной персонализацией

где - название кэша

- опциональный параметр для персонализированных элементов кэширования - идентификатор пользователя

Каждый элемент является ассоциативным массивом(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.'*'
                           ;)