Framework::xCache Data tree
Одна из особенностей моей системы является единое пространство данных и единое ядро. То есть, что именно увидит пользователь - определяется в основном не кодом, а настройками. При этом, из-за того что все проекты работают на одной машине, у нас единое адресное пространство. Из этого вытекает необходимость деления кеша по проектам.
Основным кирпичиком системы является сущность - объединение данных и методов их обработки\получения. По сути это чёрный ящик, который имеет несколько функция для общения с внешним миром. Никого не интересует как это работает, как хранятся и получаются данные, есть ли там кеширование и тд. Из этого вытекает необходимость деления кеша по сущностям.
Кроме того, зачастую бывают модули находящиеся не в системе, но желающие использовать механизм кеширования. Так что необходимо делить данные еще и по принадлежности к системе.
Из этих требований и родилась модель данных, которую я использую в фреймворке.
Дерево данных в кеше очень похоже на структуру директорий:
/project/system/entity/dataname.
Первый уровень - имя проекта. Это позволяет нам хранить все данные принадлежащие к одному проекту в одной ветке дерева. Естественно существует ветка для общих данных - она называется default.
Второй уровень - имя системы, из которой используется кеш. Это позволяет нам одновременно работать с одинаковыми сущностями из моей системы и из модулей обработки данных от наших партнёров.
Третий уровень - сущность. Не просто имя сущности, а соединение нескольких параметров инициализации кеша. Это сделано по двум причинам:
- желание использовать несколько веток кешей для одной сущности (зачем - разберу позже)
- возможность задавать множество способов первоначальной инициализации данных (при желании)
Четвертый уровень - просто имя переменной. Никаких изысков.
Каждый уровень - это вершина дерева. То есть в записи каждого уровня без завершающего слеша (/project, /project/system, /project/system/entity) хранится массив из всех вложенных уровней. Например в случае одного проекта (project1) и двух систем (system1 и system2) содержимое записи /project1 будет такое: array("system1","system2").
Имея такую структуру данных мы решаем практически все необходимые (перечислены выше) задачи. Очистка кеша проекта сводится к рекурсивному спуску по дереву и последовательному удалению. Так же решается и задача сброса ветки при обновлении - просто стартовой точкой становится не проект, а отдельная его часть.
На самом деле эта модель позволяет и блокировать ветки (или проект), но об этом ниже.
0 коммент.:
Отправить комментарий