Объяснение системы - Технология кэширования PHP

Архитектура PHP
Объяснение системы - Технология кэширования PHP

Обзор

Кэширование стало неотъемлемой частью проекта, это лучший способ повысить производительность, например, уменьшить сетевой ввод-вывод, уменьшить дисковый ввод-вывод и т. д., чтобы скорость загрузки проекта стала быстрее.

Кэш может быть кешем ЦП, кешем памяти, кешем жесткого диска, а скорость запросов разных кешей различна (кеш ЦП лучше, чем кеш памяти, лучше, чем кеш жесткого диска).

Далее я представлю их вам один за другим.

кеш браузера

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

Сильный кеш

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

Определите, попал ли сильный кеш в соответствии с Expires и Cache-Control.

код показывает, как показано ниже:

    header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');

    header("Cache-Control: max-age=3600"); //有效期3600秒

скопировать код

Cache-Control также может устанавливать следующие параметры:

  • public: может кэшироваться всеми пользователями (браузер/CDN-сервер конечного пользователя)

  • частный: может кэшироваться только браузером конечного пользователя

  • no-cache: не использовать локальный кеш

  • no-store: отключить кеширование данных

Согласовать кеш

Запрос, отправленный пользователем, отправляется на сервер, и сервер определяет, следует ли использовать кэш клиента.

код показывает, как показано ниже:

    $last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);

    if (time() - $last_modify < 3600) {

    header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT');

    header('HTTP/1.1 304'); //Not Modified

    exit;

    }

    header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');

скопировать код

Влияние действий пользователя на кеширование

операционное поведение Expires Last-Modified
Введите в адресной строке эффективный эффективный
прыжок страницы эффективный эффективный
новое окно эффективный эффективный
вперед назад эффективный эффективный
F5 обновить недействителен эффективный
Ctrl+F5 обновить недействителен недействителен

файловый кеш

кеш файла данных

Кэшируйте данные с низкой частотой обновления и высокой частотой чтения в файлы.

Например, если данные города используются для трехуровневой привязки во многих местах проекта, мы можем кэшировать данные города в файл (city_data.json), и JS может напрямую читать этот файл, не запрашивая внутренний сервер.

Статическая по всей станции

CMS (система управления контентом), возможно, все знакомы с ней. Например, в ранних DEDE и PHPCMS статический HTML можно было установить в фоновом режиме.Когда пользователи посещают веб-сайт, они читают статический HTML, не запрашивая серверную базу данных. или интерфейс данных запроса Ajax для ускорения загрузки веб-сайта.

Статический HTML имеет следующие преимущества:

  • Способствует индексации поисковыми системами (SEO)

  • Страница открывается быстро

  • Снизить нагрузку на сервер

Кэширование CDN

CDN (сеть доставки контента) сеть распространения контента.

Когда пользователь посещает веб-сайт, контент ближайшего узла CDN автоматически выбирается без запроса исходного сервера, что ускоряет открытие веб-сайта.

Кэш в основном включает статические ресурсы, такие как HTML, изображения, CSS, JS и XML.

Кэш NoSQL

Кэш Memcached

Memcached — это высокопроизводительный кэш-сервер с распределенной памятью.

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

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

Memcached поддерживает только данные типа K/V и не поддерживает постоянное хранилище.

Разница между Memcache и Memcached

  • Начиная с 0.2.0, для Memcached требуется версия PHP >= 5.2.0, а для Memcache требуется версия PHP >= 4.3.

  • Последний выпуск Memcached — 24 декабря 2018 г., а последний выпуск Memcache — 07 апреля 2013 г.

  • Memcached основан на libmemcached, а Memcache основан на расширениях PECL.

Думайте о Memcached как об обновленной версии Memcache.

Руководство пользователя PHP Memcached:

http://www.php.net/manual/zh/book.memcached.php

Memcached часто сравнивают с Redis, далее я расскажу о кеше Redis.

Кэш Redis

Redis — это высокопроизводительная база данных K/V.

Redis в значительной степени компенсирует отсутствие хранилищ Memcached K/V, таких как List (связанный список), Set (коллекция), Zset (упорядоченная коллекция), Hash (хэш), которые могут хранить данные в памяти или хранить данные в памяти. сохраняется на диск и поддерживает синхронизацию master-slave.

В целом, Redis можно рассматривать как расширенную версию Memcached, более тяжеловесную и мощную.

Redis в основном используется в повседневной работе.

Учебный веб-сайт Redis: http://www.redis.cn/

Кэш MongoDB

MongoDB — это база данных, основанная на распределенном хранилище файлов. Написан на языке С++.

Он направлен на предоставление масштабируемого высокопроизводительного решения для хранения данных для веб-приложений.

MongoDB — это продукт между реляционными и нереляционными базами данных, наиболее многофункциональный и наиболее похожий на реляционные базы данных среди нереляционных баз данных.

Учебный веб-сайт MongoDB: http://www.mongodb.org.cn

Кэш веб-сервера

Кэш Apache

использоватьmod_expires, указать время истечения кэша, можно кэшировать HTML, картинки, JS, CSS и т.д.

Открытымhttp.conf, откройте модуль:

                                

    LoadModule expires_module modules/mod_expires .so

скопировать код

Укажите время истечения кэша:

    <IfModule expires_module>

    #打开缓存

    ExpiresActive on

    #css缓存(8640000秒=10天)

    ExpiresByType text/css A8640000

    #js缓存

    ExpiresByType application/x-javascript A8640000

    ExpiresByType application/javascript A8640000

    #html缓存

    ExpiresByType text/html A8640000

    #图片缓存

    ExpiresByType image/jpeg A8640000

    ExpiresByType image/gif A8640000

    ExpiresByType image/png A8640000

    ExpiresByType image/x-icon A8640000

    </IfModule>

скопировать код

Кэш Nginx

использоватьexpireПараметр указывает время истечения срока действия кеша, который может кэшировать HTML, картинки, JS, CSS и т. д.

Открытымnginx.conf:

    //以图片为例:

    location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location

    root html;

    expires 1d; #指定缓存时间

    }

скопировать код

Вы также можете узнать о: proxycachepath и proxy_cache для установки кеша.

Кэш кода операции

Опкод (Operate Code) код операции.

После запуска PHP-программы вся память сразу освобождается, все переменные в программе уничтожаются, и каждый запрос необходимо повторно транслировать и выполнять, что может привести к снижению скорости.

Когда интерпретатор завершает анализ кода скрипта, он генерирует промежуточный код, также известный как код операции, который можно запускать напрямую.

Назначение кодов операций — избежать повторной компиляции и снизить нагрузку на ЦП и память.

Кэш APC

APC (альтернативный кэш PHP) дополнительный кэш PHP.

Цель APC — предоставить бесплатную, открытую и надежную платформу для кэширования и оптимизации промежуточного кода PHP.

APC может сократить время динамического синтаксического анализа и компиляции php, чтобы скрипты php выполнялись быстрее.

Последний раз расширение APC было выпущено 03 сентября 2012 г.

Если вам интересно, вы можете узнать об официальном введении: http://php.net/manual/zh/book.apc.php

eAccelerator

eAccelerator: кэш кода операции PHP.

Если вам интересно, вы можете узнать об официальном введении: http://eaccelerator.net/

XCache

XCache — это быстрый и стабильный кеш кода операции PHP.

Если вам интересно, вы можете узнать об официальном введении: http://xcache.lighttpd.net/

резюме

В этой статье кратко рассказывается о кэшировании браузера, кэшировании файлов, кэшировании NoSQL, кэшировании веб-сервера и кэшировании кода операции.

Каждый тип кеша можно подробно изучить, начиная с введения -> установки -> использования -> сводки сценариев применения.

Вы можете подумать о том, через приведенное выше введение, какие кеши мы используем в нашей работе?

Какие еще кеши мы можем использовать, чтобы помочь нашему проекту?

Часто задаваемые вопросы о кэшировании

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

Я перечислю несколько вопросов для вас, это чисто для справки.

Когда в проекте используется кеширование, мы выбираем Redis или Memcached, почему?

Вот несколько сценариев:

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

Используйте Redis lpush, rpop или rpush, lpop напрямую.

    //进队列

    $redis->lpush(key, value);

    //出队列

    $redis->rpop(key);

скопировать код

Memcached не имеет такой структуры данных.

2. Например, мы хотим хранить информацию о пользователе, ID, имя, номер телефона, возраст, рост, как это хранить?

Вариант 1: ключ => значение

ключ = идентификатор пользователя userdata

значение = json_encode (пользовательские данные)

При запросе сначала извлеките ключ, а затем выполните синтаксический анализ json_decode.

Вариант 2: хэш

ключ = идентификатор пользователя userdata

hashKey = имя, значение = xx

hashKey = телефон, значение = xx

hashKey = возраст, значение = xx

hashKey = высота, значение = xx

При запросе просто выньте ключ.

    //新增

    $redis->hSet(key, hashKey, value);

    $redis->hSet(key, hashKey, value);

    $redis->hSet(key, hashKey, value);

    //编辑

    $redis->hSet(key, hashKey, value);

    //查询

    $redis->hGetAll(key); //查询所有属性

    $redis->hGet(key, hashKey); //查询某个属性

скопировать код

Вариант 2 лучше, чем Вариант 1.

3. Например, социальные проекты, похожие на Sina Weibo, персональный центр просмотра списка и списка поклонников, двусторонний список просмотра, популярный Weibo, подписку на новости и т. д.

Все вышеперечисленное может использовать соответствующие структуры данных, предоставляемые Redis.

В-четвертых, Memcached хранится только в памяти, тогда как Redis может храниться в памяти или сохраняться на диске.

Если данные в ваших требованиях должны быть сохранены, выберите Redis.

Лично я не использую Memcached в своей работе, и лучше, чем Redis, получать выделение памяти Memcached путем запроса данных.

Memcached по умолчанию использует механизм Slab Allocation для управления памятью.В соответствии с заданным размером выделенная память делится на блоки определенной длины для хранения записей данных ключ-значение соответствующей длины, чтобы полностью решить проблему памяти. фрагментация.

Как обеспечить согласованность данных между кешем и базой данных?

Новые данные: сначала добавить в базу, а потом добавить в кеш.

Редактировать данные: сначала удалите кэшированные данные, затем измените данные в базе данных, а затем добавьте их в кэш.

Удалить данные: сначала удалите кэшированные данные, а затем удалите данные в базе данных.

Запросить данные: сначала запросите кешированные данные, если нет, то запросите базу данных, а затем добавьте их в кеш.

Строгую согласованность трудно гарантировать, например, согласованность транзакций, согласованность на определенный момент времени, согласованность в конечном счете и т. д.

Анализ конкретных проблем.

Как насчет проникновения в кеш?

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

1. Установите обычное значение ключа и сначала проверьте, соответствует ли ключ спецификации.

2. Ограничение тока интерфейса, переход на более раннюю версию и фьюзинг, пожалуйста, изучите istio: https://istio.io/

В-третьих, фильтр Блума.

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

А лавина?

1. Блокировка взаимного исключения, разрешается только один запрос на перестроение индекса, а остальные запросы ждут выполнения перестроения кеша, а затем снова извлекают данные из кеша.

2. Стратегия двойного кеша, исходный кеш и кеш-копия, когда исходный кеш недействителен и запрашивается кеш-копия, время аннулирования исходного кеша устанавливается на краткосрочный период, а кеш-копия устанавливается на длительный срок.

Я уже упоминал об этом, и это чисто отсылка к моей собственной ситуации, давайте разберем ее подробно.

Рекомендуемое чтение

Эту статью можно переслать, пожалуйста, укажите автора и источник для пересылки, спасибо!