2008-11-27 7 views
12

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

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

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

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

Мой вопрос ..

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

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

+0

Посмотрите эту тему на эту тему http://stackoverflow.com/questions/276709/design-pattern-for-memcached-data-caching – 2008-11-27 03:07:50

ответ

15

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

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

+0

Спасибо, Роб очень хороший момент. – 2008-11-27 01:57:06

6

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

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

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

+2

Как вы реализуете тегирование? Используете ли вы этот взломанный memcached http://code.google.com/p/memcached-tag/ или делаете ли вы это в своем приложении? Можете ли вы опубликовать пример? – 2008-11-27 02:19:15

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; 

} 

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

1

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

0

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

Смежные вопросы