Тегування кешу в Yii, SavePearlHarbor
Ще одна копія хабора
Тегування кешу в Yii
У першій статті кешують із залежністю від одного тега. У другій статті вже залежність від кількох тегів, але використання описаної конструкції вносить певний ефект несподіванки до проекту. Сподіватися, що будь-який тег проживе довше запису поміченого цим тегом мені здається легковажним. Не знайшовши відповідного рішення, написав своє за мотивами Dklab_Cache_Backend_TagEmuWrapper але в стилі Yii. Сформулюю завдання, яке потрібно було реалізувати.
- Будь-яке значення можна (але не обов'язково) позначити одним або декількома тегами.
- Потрібна можливість видалити тег
- При видаленні тега стає актуальним весь кеш, позначений цим тегом
- Для того, щоб мати можливість перевіряти актуальність тегів, зберігатимемо разом із тегом його версію.
- Разом із тегованим записом, у кеш зберігається список тегів, якими вона позначена.
- При перевірці актуальності запису в кеші ми висмикуємо всі теги, якими позначено запис у кеші, та порівнюємо їх із збереженими в кеші тегами
Опишу на пальцях, що означають останні три умови. Допустимо ми зберігаємо в кеш запис із ключем «key» та значенням «value». Позначаємо цей запис тегами "tagA", "tagB". Як то так:
при цьому в кеш зберігаються три записи:
- ‘key’ => array(array(‘tagA’ => version(‘tagA’), ‘tagB’=>version(‘tagB’)), ‘value’)
- ‘tagA’ => version('tagA')
- ‘tagB’ => version('tagB')
Насправді Yii додає до масиву копію об'єкта Dependency, щоб потім перевіряти актуальність кешу. (Але тут не відображено, щоб не захаращувати текст.)
Тепер припустимо, що мичитаємо запис із кеша. При цьому виконуються такі кроки:
- Читається запис із ключем ‘key’
- Читаються склеєні із записом теги
- Теги з кешу порівнюються з копіями тегів у записі
- Якщо теги не співпали, робиться висновок, що кеш застарів
Ось як виявляється просто. А ось і код:
та хелпер до цієї залежності
т.к. я в коді використовував простір імен, то конфізі потрібно буде прописати аліас
і можна використовувати нову залежність, наприклад:
Для повного щастя зробимо прозоре кешування моделей даних CActiveRecord. (Потрібно кудись застосувати новий клас) Створюємо новий файл protected/components/ActiveRecord.php з таким вмістом:
успадковуємо його замість CActiveRecord та спостерігаємо за зменшенням з'єднань з базою