Обзор
Кэширование стало неотъемлемой частью проекта, это лучший способ повысить производительность, например, уменьшить сетевой ввод-вывод, уменьшить дисковый ввод-вывод и т. д., чтобы скорость загрузки проекта стала быстрее.
Кэш может быть кешем ЦП, кешем памяти, кешем жесткого диска, а скорость запросов разных кешей различна (кеш ЦП лучше, чем кеш памяти, лучше, чем кеш жесткого диска).
Далее я представлю их вам один за другим.
кеш браузера
Браузер сохраняет запрошенную страницу в кеше клиента. Когда посетитель снова посещает страницу, браузер может напрямую считать данные из кеша клиента, что уменьшает доступ к серверу и ускоряет скорость загрузки веб-страницы.
Сильный кеш
Запрос, отправленный пользователем, получается напрямую из клиентского кеша без обращения к серверу.
Определите, попал ли сильный кеш в соответствии с 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. Стратегия двойного кеша, исходный кеш и кеш-копия, когда исходный кеш недействителен и запрашивается кеш-копия, время аннулирования исходного кеша устанавливается на краткосрочный период, а кеш-копия устанавливается на длительный срок.
Я уже упоминал об этом, и это чисто отсылка к моей собственной ситуации, давайте разберем ее подробно.
Рекомендуемое чтение
Эту статью можно переслать, пожалуйста, укажите автора и источник для пересылки, спасибо!