Паттерны проектирования PHP memcache

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

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

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

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

У меня вопрос ..

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

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

Смотрите эту ветку по той же теме stackoverflow.com/questions/276709/…

Dana the Sane 27.11.2008 06:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
12
1
7 680
5

Ответы 5

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

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

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

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

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

Как вы реализуете тегирование? Вы используете этот взломанный memcached code.google.com/p/memcached-tag или делаете это в своем приложении? Можете опубликовать пример?

Kevin Dente 27.11.2008 05:19

Я использую что-то похожее на то, как реализован Zend_Cache. Вы можете прочитать об этом здесь - framework.zend.com/manual/en/… и проверить источник фактической реализации

Eran Galperin 27.11.2008 05:29

Реализация аннулирования тегов Zend_Cache выполняется очень медленно, так как она читает все файлы для проверки тегов. (по крайней мере, в версиях Zend Framework 1)

Artem Goutsoul 11.03.2012 01:38

Я использую компонент Zend Cache (вам не обязательно использовать весь фреймворк, только кеш zend, если хотите). Он абстрагирует часть кеширования (он поддерживает группировку кеша по «тегам», хотя эта функция не поддерживается для бэкэнда 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) в кэше памяти, и мы используем триггеры в таблицах, чтобы сделать кеш недействительным - есть несколько API (например, pgmemcache, я думаю, что у mysql есть что-то подобное, но у меня нет знаю точно). Преимущество состоит в том, что собственная база данных (триггеры) может обрабатывать аннулирование данных при изменениях (обновлении, вставке, удалении), вам не нужно записывать все это в свое «приложение».

mysqlnd_qc, который вставляет memcaching на уровне возврата результатов запроса к базе данных, автоматически кэширует наборы результатов из mysql. Это ФАНТАСТИЧЕСКИЙ и автоматический.

Другие вопросы по теме