Pull to refresh

Memcached тэги в PHP на скорую руку, без фрэймворков

Reading time2 min
Views734

Предисловие


На сегодняшний день, такой иснтрумент как 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 которая достаточно интересна, но еще в стадии тестирования.
Tags:
Hubs:
Total votes 1: ↑1 and ↓0+1
Comments0

Articles