Skip to content
crazedr0m edited this page Apr 18, 2012 · 8 revisions

Кэширование

(В процессе написания, если не изменялась больше недели, то значит это уже не так и автор потерял музу :) )

На этой странице будут рассмотрены несколько несколько onPHP воркеров и кратко описаны прицнипы как они работают, что умеют делать автоматически, а что не умеют.

NullDaoWorker

Воркер не кэширующий ничего. Любой запрос он всегда отправляет в базу.

CommonDaoWorker

Объекты получаемые методами getById и getByIds по умолчанию кэшируются и кладутся по ключу на основе их идентификатора и имени класса. При изменении/удалении объектов вызывается uncacheById(s) которые на основе имени класса и идентификаторе формирует ключ, которые необходимо удалить в кэше. Списки по умолчанию не кэшируются, но если кэшировать то кэширует по ключу формируемому на основе запроса, что-то вроде "хэш запроса". Соотвественно для раскешивания таких запросов необходимо вызывать метод uncacheByQuery передавая туда конкретный запрос.

CacheDaoWorker

По умолчанию кэширует все запросы - и getById(s) и все остальные. getById кэшируются так же как в CommonDaoWorker. Остальные запросы кэшируются по другому. Для каждого класса в специальном адресе хранится случайное число, оно учавствует в формировании ключа по которому хранится кэш запроса. Если один из объектов класса изменяется/удаляется - в ячейку кладется новое случайное число и все запросы ищутся/кладутся по новым ячейкам. Таким образом как только изменяется/удаляется один из объектов класса - сбрасывается его кэщ getById, а так же все остальные запросы сделанные через его DAO. Соотвественно все запросы в рамках одной таблицы всегда актуальны, если запрос был сделан с участием нескольких таблиц - его актуальность не гарантированна.

TaggableDaoWorker (еще не в мастере)

В предыдущих воркерах кэш можно раскешить либо по сформировав "тот самый запрос, который был закэшен" (CommonDaoWorker), либо по групповому ключу, раскэшивающему все запросы класса (CacheDaoWorker). Порой же хочется что бы запрос был связан с несколькими тэгами и при дерганьи любого из них он становился не валидным. Как это делается: В отличие от других воркеров в кэш кладется не объект/список объектов, а массив где первый элемент это все тот же объект/список объектов, а второй элемент - это теги с датами их актуальности. Что вроде такого:

<?php
array(
    'data' => new TestCity(),
    'tags' => array(
        'tag1' => 12345,
        'tag2' => 54321,
        ...
        'tagn' => 44444,
    ),
);

Актуальные значения тэгов лежат в по отдельным ключам в том же кэше. Когда объект/список кладется в кэш, то для него вычисляются тэги и достаются из кэша их текущие значения. При получении данных из кэша - смотрятся тэги, если у какого-то из них время не совпадает с временем укладки - кэш считается не актуальным и запрос отправляется в базу. Для вычисления тегов по которым кешаться объекты/списки TaggableDaoWorker обращается к классу TaggableHandler, который в свою очередь анализирует запрос и возвращает список тегов для него. Тоже самое касается и раскешивания - воркер спрашивает класс какие теги необходимо раскешить при изменении/удалении данного объекта. На данный момент написано два TaggableHandler'а

  • TaggableLayerHandler - достаточно прост, сделан так что бы TaggableDaoWorker вместе с ним работал точно так же как CacheDaoWorker.
  • TaggableSmartHandler - написан для реализации более "хитрого" кэширования. Требует что бы все OneToOne связи были lazy. В таком случае запросы должны раскэшиваться вовремя и не терять актуальности. Чуть позже будет написана отдельная страница посвященная TaggableDaoWorker + TaggableSmartHandler
Clone this wiki locally