Intereting Posts
Час AJAX, окно автоматической прокрутки Выйти из системы в приложении Symfony 2, когда включена опция «запомнить меня» Оператор «Guard», такой как JavaScript в PHP Как маршрутизировать контроллеры в подпапках с помощью codeigniter 3? Проверьте, есть ли HTTP-запрос из моего приложения для Android Максимальная длина данных LONGBLOB Mysql PDO при выборке Что более эффективно, строковые функции PHP или регулярное выражение в PHP? как изменить имя переменной php в цикле? Может ли php cron задавать доступ к переменным сеанса / файлам cookie? Как запустить одиночный метод тестирования с помощью phpunit? Форма HTML не меняет URL как ожидалось Значение часового пояса Twitter и время создания_создания (utc time) для расчета того, в какой часовой пояс находится пользователь Работает ли кеш-код opcode PHP с __autoload? PHP библиотека шаблонов PDF с выходом PDF? Удалите лишние пробелы, но не пробелы между двумя словами

PHP шаблоны дизайна memcache

Мы используем memcache в основном как мысль о том, чтобы просто кэшировать результаты запроса.

Недействительность – это кошмар из-за того, как она была реализована. Мы с тех пор узнали некоторые методы с memcache через чтение списка рассылки, например, трюк, чтобы позволить группе аннулировать кучу ключей. Для тех, кто это знает, пропустите следующий абзац.

Для тех, кто не знает и не заинтересован, трюк добавляет порядковый номер к вашим ключам и сохраняет этот порядковый номер в memcache. Затем каждый раз, когда вы делаете свое «получение», вы захватываете текущий порядковый номер и создаете свои ключи вокруг этого. Затем, чтобы аннулировать всю группу, вы просто увеличиваете этот порядковый номер.

Так или иначе, я в настоящее время пересматриваю нашу модель для ее реализации.

Мой вопрос …

Мы не знали об этом шаблоне, и я уверен, что есть другие, о которых мы не знаем. Я искал и не смог найти какие-либо шаблоны проектирования в Интернете для реализации memcache, лучших практик и т. Д.

Может ли кто-то указать мне на что-то подобное или даже написать пример? Я хотел бы убедиться, что мы не совершаем ошибку начинающих в нашем новом рефакторинге.

Solutions Collecting From Web of "PHP шаблоны дизайна memcache"

Один момент, который нужно запомнить с кэшированием объектов, заключается в том, что это просто – кеш объектов / сложных структур. Многие люди ошибаются, попадая в свои тайники, для простых, эффективных запросов, которые несут накладные расходы на проверку кеша / пропуски, когда база данных будет получать результат намного быстрее.

Этот совет – тот, который я принял близко к сердцу, так как меня учили; знать, когда не кэшировать, то есть когда накладные расходы отменяет воспринимаемые выгоды. Я знаю, что он не отвечает на конкретный вопрос здесь, но я думал, что это стоит указать на общий намек.

То, что говорит граб, – хороший совет. По моему опыту, существуют два распространенных способа идентификации и аннулирования тегов: уникальная идентификация и идентификация на основе тегов. Обычно их объединяют, чтобы сформировать полное решение, в котором:

  1. Кэш-записи присваивается уникальный идентификатор (который обычно зависит от данных, которые он кэширует) и, при необходимости, любое количество тегов.
  2. Записи кэша вызываются по их уникальному идентификатору.
  3. Записи кэша могут быть признаны недействительными по их уникальному идентификатору (по одному за раз) или по любому тегу, который они помечены (возможно, одновременно аннулирует несколько записей).

Это относительно просто реализовать и в целом работает очень хорошо. Я еще не сталкивался с системой, которая нуждалась в большем количестве, хотя, вероятно, есть некоторые краевые случаи, требующие конкретных решений.

Я использую компонент Zend Cache (вам не нужно использовать всю фреймворк, только если вы хотите). Он абстрагирует некоторые элементы кэширования (он поддерживает группировку кеша «тегами», хотя эта функция не поддерживается для задней части memcache. Я с относительной легкостью применил собственную поддержку «тегов»). Таким образом, шаблон, который я использую для функций, которые используют кеш доступа (как правило, в моей модели), таков:

public function getBySlug($ignoreCache = true) { if($ignoreCache || !$result = $this->cache->load('someKeyBasedOnQuery')) { $select = $this->select() ->where('slug = ?', $slug); $result = $this->fetchRow($select); try { $this->cache->save($result,'someKeyBasedOnQuery'); } catch(Zend_Exception $error) { //log exception } } else { $this->registry->logger->info('someKeyBasedOnQuery came from cache'); } return $result; } 

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

Мы также сохраняем результаты запроса из нашей базы данных (PostgreSQL) в memcache, и мы используем триггеры в таблицах, чтобы аннулировать кеш – есть несколько API-интерфейсов (например, pgmemcache , я думаю, что mysql имеет что-то подобное, но я не точно знаю). Преимущество состоит в том, что сама (триггеры) базы данных могут обрабатывать недействительность данных об изменениях (обновление, вставка, удаление), вам не нужно записывать все эти материалы в ваше «приложение».

mysqlnd_qc, который вставляет memcaching на уровне возврата результатов запроса базы данных, автоматически создает кеш-данные из mysql. Это FANTASTIC и автоматический.