Кеширование данных, полученных с БД

Разработка под LiveStreet CMS
кеширование в livestreetВ ЛС встроен механизм кеширования информации, полученной из БД и этот топик призван пролить луч света на использование кеширования в ЛС в плагинах, т.к. это довольно просто.

В вашем плагине важно определить точки, где вы получаете данные и где их записываете/модифицируете (обычно это происходит в маппере). Кеширование должно работать по логике: пока данные в БД не менялись — возвратить их с кеша, а не запросами из БД, которая и так постоянно нагружена.

Схема работы кеша:

  1. Там, где идет изменение данных в БД (insert, update, delete) — чистим то, что сохранили в кеше.
  2. Там, где идет выборка данных (select) — проверяем:
    • Есть ли данные которые хотим получить в кеше? Если есть — то возвращаем из кеша
    • Есть ли данных нет, то нужно их получить путем запроса к БД и то, что получили тут же сохранить в кеш

В модуле для кеширования ЛС есть такие интересные для нас функции:

  1. Получение данных из кеша по имени (ключу), геттер
  2. Занесение данных в кеш по имени (ключу), сеттер
  3. Очистка кеша по имени или тегам

Имя — некое символическое представление того что вы ищете в БД (ключ). Например, вы хотели бы получить список книг от автора с ИД=2, вы бы выполнили запрос в БД где указали условие:

SELECT * FROM `books` WHERE `author_id` = 2

Вот и в кеше можно было сохранить результат выборки под именем (ключем), например, "book_by_author_2", а потом пока данные не меняются — брать данные не из БД, а из сохраненного значения.

Примеры кода:

1. Когда делаем выборку (select) — ищем информацию в кеше по имени, например, "book_by_author_2", если есть — возвращаем её, нету — берем из БД, сохраняем в кеш. И потом её возвращаем:

if (false === ($data = $this -> Cache_Get ("book_by_author_{$iAuthorId}"))) {
  $data = $this -> oMapper -> GetBooksByAuthorId ($iAuthorId);
  $this -> Cache_Set ($data, "book_by_author_{$iAuthorId}", array ("book_change"), 60 * 60 * 24 * 3);
}

2. Когда делаем изменения в БД (insert, update), чистим кеш по тегам. Также когда удаляем данные из таблицы — удаляем кешированный результат, который может содержать значение которое мы удаляем:

$this -> Cache_Clean (Zend_Cache::CLEANING_MODE_MATCHING_TAG, array ('book_change'));


Важный параметр — теги кеша. Именно их мы видим в сеттере 3-м параметром и при удалении/редактировании данных. Т.е. при занесении информации нужно указать к чему эта информация относится, например, к получению лучших авторов книг на сайте. И если удалять автора, то удаление затронет выборку лучших авторов, поэтому при удалении в тегах можно указать и тег получения лучших авторов — это кеш будет сброшен и заново установлен при следующей выборке.
В сеттере последний параметр — это время действия кеша по-умолчанию. Т.е. если данные не изменятся 3 суток, то кеш потом все равно будет сброшен автоматически.
3. Удаление кеша по имени (ключу):

$this -> Cache_Delete ("book_by_author_{$iAuthorId}");


Пару важных моментов при работе с кешем в ЛС:

  • Код кеширования нужно писать в модулях плагинов.
  • Старый кеш (тот у которого вышло время) удаляется в ЛС постепенно — в engine/modules/cache/Cache.class.php, в конце public function Init ()

Заключение

Использование кеша необходимо только там, где в этом есть целенаправленная необходимость — мало меняющиеся данные, которые очень часто получают из БД. Если данные подвергаются постоянной смене, то использование кеша сомнительно.
Надеюсь эта статья поможет авторам плагинов для ЛС сделать их более быстродействующими.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.