Предисловие
На сегодняшний день, такой иснтрумент как memcached, является практически незаменимым в работе крупных проектов. Он облегчает нагрузку на сервера как в обычные дни, так и в моменты когда сайт подвергается хабраэфекту или похожим нашествиям посетителей.
Долгое время мне приходилось писать полностью линейный код, не используя OOP, за исключением классов для роботы с MySQL, Memcached, и сессиями. Все остальные классы состояли лишь из статических функций что по сути лишь заменяло, допустим, member_get_id() на Member::get_id();.
Единственное НО — такой стиль превратился в фабрику по производству велосипедов, и сегодня я бы хотел поделиться с Вами одним из них. А именно: простым классом для работы с memcached, поддерживающим функционал тэгов, или как их подругому называют (редко) — нэймспэйсов.
Линейное программирование меня привлекает тем что скорость его выполнения максимальна, а нагрузка такими не нужными мне вещами как рутингом, автоматическим поиском файлов с необходимым мне классом и т.д. полностью отсутствует, ведь я и так знаю что где находится, и мне не нужны десятки и сотни вещей которые будут пылиться где-то в далёкой папке.
Ближе к делу
Задача была проста — класс должен быть лёгким в использовании, и добавление ключа как в кэш так и в определённый тэг должно происходить одним вызовом функции set данного класса. Реализовал функцоинал таким образом:
$mcache->set('news\p1', $data, $ttl);
Этот код добалвяет в кэш ключ news_p1 (заметьте, backslash превратился в underscore), а так-же добавляет это-же название ключа в тэг ns_news (префикс ns_ добавляется автоматически). В будущем если после редактирования или удаления какой-либо записи нужно будет удалить все кэшированные данные с ключём формата news*, просто выполняем:
$mcache->delete('news*');
Обратите внимание на звёздочку в конце ключа, именно она даёт понять методу delete что нам нужно удалить всё из тэга news, в противном случает метод попытается удалить именно ключ news.
Если нужно удалить какой-то определённый ключ, и информацию о нём из тэга, пишем так-же как писали в set:
$mcache->delete('news\p1');
Так-же возможно множественное удаление передачей нескольких параметров:
$mcache->delete('news*', 'members*', 'categories', 'comments\p1');
И что бы всё было в одном стиле, в методе get пишем также:
$mcache->get('news*');
или
$mcache->get('news\p1');
Важно знать: Первый вариант, где мы запрашиваем news*, вернёт не все данные из ключей которые содержатся в тэге news, а лишь список самих ключей.
Сам код
Код достаточно объёмный… разместил на первом попавшемся сурс-хостинге…
Код класса находится тут
Возможные доработки
Есть идеи что можно изменить слегка… это добавить поддрежку более одного сервера, и кое-какой дебаггинг и еррор-хэндлинг…
Где использовал
В двух проектах, один по работе, другой хобби… а точнее socialz.net, о его технических подробностях напишу в скорем времени, когда запущу v2 которая достаточно интересна, но еще в стадии тестирования.