Кэш: что это такое и как с ним справиться начинающим разработчикам
Содержание:
- Cache Timing
- Кэширование в базах данных
- Структура
- ExpiresActive Directive
- 2015: InterSystems Caché 2015.1
- Обзор
- Принцип «одна машина – одна кэш-память»
- Новое ядро
- Кэширование фрагментов
- Настройка кэширования для proxy_pass
- Список программ: сравнение, плюсы и минусы использования
- ExpiresActive Directive
- Извлечение из кэша
- Автоматическое удаление кэша при выполнении действий контроллера
- Кэширование запросов
- Параметры файла подкачки
- Что можно хранить в кеше
- Инициализация хранилища
Cache Timing
Если переводить на русский, это атака, основанная на измерении времени загрузки кэша браузера. В интернете немного пишут про эту атаку, уходя в дебри ее реализации и практического применения. Основная задача этой атаки – получить информацию, открывался ли когда-либо ранее тот или иной сайт.
Опишу ее общий смысл на простейшем и всем понятном примере. Вы взяли компьютер друга и открываете на нем один из популярных порносайтов. Ваш друг может очистить историю, и браузер не будет помнить, чтобы этот сайт когда-либо открывался. Но если он открывал этот сайт, вероятнее всего, у него сохранилась кэшированная версия.
Вы открываете сайт в приватном режиме браузера и в обычном, сравнивая скорость загрузки. Если скорость одинаковая, значит, сайт открывается впервые, если в обычном режиме сайт загружается быстро, а в приватном долго, значит, на компьютере имеется кэшированная версия, которая и ускоряет загрузку в обычном режиме. Вот и весь смысл тайминга кэша.
Кэширование в базах данных
В предыдущем разделе мы обсудили сети доставки контента (CDN) и тот факт, что они являются посредниками между клиентом и сервером. Аналогичным образом система кэширования базы данных является посредником между сервером и базой данных. Существует множество таких систем кэширования, например redis, memcache и т. д. Их работа объяснена ниже:
Инвалидация кэша в базах данных
Каждая из подобных систем предоставляет свои собственные методы уничтожения кэша. Обратитесь к их документации, чтобы узнать больше.
Теперь перейдем к вопросу, почему начинающим разработчикам приходится с этим бороться. Как правило, в современных стеках технологий применяются все три вида кэширования. И иногда разработчики застревают при отладке.
Представьте, что вы внесли некоторые изменения в свой веб-сайт, но они не отображаются. Если предположить, что с кодом все в порядке, виновником этого может быть любой из трех вышеописанных видов кэширования. Но это относительно небольшой недостаток (даже не недостаток, если вы о нем знаете) по сравнению с огромным положительным эффектом, который дает кэширование. Этот эффект выражен в масштабируемости, меньшем времени отклика и в целом лучшем пользовательском интерфейсе.
Структура
Первое, что необходимо сделать, это создать структуру описывающую наш контейнер-хранилище:
- — для безопасного доступа к данным во время чтения/записи (подробнее о мьютексах https://gobyexample.com/mutexes),
- — продолжительность жизни кеша по-умолчанию (этот параметр можно будет переопределить для каждого элемента)
- — интервал, через который запускается механизм очистки кеша (Garbage Collector, далее GC)
- — элементы кеша (в формате ключ/значение)
Теперь опишем структуру для элемента:
- — значение. Так как оно может быть любое (число/строка/массив и т.д) необходимо указать в качестве типа ,
- — время создания кеша,
- — время истечения (в UnixNano) — по нему будем проверять актуальность кеша
ExpiresActive Directive
Enables generation of headers |
|
server config, virtual host, directory, .htaccess | |
Indexes | |
Extension | |
mod_expires |
This directive enables or disables the generation of the
and headers for
the document realm in question. (That is, if found in an
file, for instance, it applies only to
documents generated from that directory.) If set to
, the headers will not be generated for any
document in the realm (unless overridden at a lower level, such as
an file overriding a server config
file). If set to , the headers will be added to
served documents according to the criteria defined by the
and
directives (q.v.).
2015: InterSystems Caché 2015.1
Повышение масштабируемости Caché 2015.1
Реализованные в новой версии Caché важные изменения направлены на повышение производительности и масштабируемости в крупных многоядерных системах. Исходные тесты системы свидетельствуют о возможности практически линейного горизонтального масштабирования системы с 16 до 64 ядер. В отношении производительности нам удалось упростить ядро базы данных и внедрить более эффективные алгоритмы работы с данными, повысив производительность системы при использовании разных моделей доступа к приложениям. В результате этих изменений работа большинства приложений будет более эффективной, однако истинные преимущества станут доступны тем, кто планирует выполнить масштабирование с 16 до 64 ядер.
Мы обновили несколько внутренних алгоритмов, упростив и оптимизировав их, что сделало возможным использование архитектуры и функций современного оборудования (чипсетов). Например, в системах с большим количеством ядер нередко наблюдаются так называемые замедления NUMA, вызванные неравномерным доступом к данным, однако поставщики оборудования часто предоставляют инструкции и техники программирования для конкретных чипов, позволяющие свести задержку к минимуму. В версии 2015.1 нам удалось реализовать подобные техники, чтобы производительность системы, измеряемая по времени отклика приложений, не снижалась при ее вертикальном масштабировании.
Мы добавили несколько новых алгоритмов, чтобы оптимизировать параллельную обработку конкретных рабочих нагрузок. Это становится особенно заметным, если посмотреть на время отклика приложений — оно не меняется даже при добавлении в систему рабочих нагрузок и пользователей по принципу горизонтального масштабирования.
Несколько модификаций было выполнено с целью оптимизации критических секций и внутренних ресурсов, в результате удалось обеспечить гораздо более высокую пропускную способность благодаря параллелизации процессов при горизонтальном и вертикальном масштабировании.
Масштабируемость: вертикальная и горизонтальная
Существует два подхода к масштабированию программного обеспечения.
- Вертикальное масштабирование заключается в добавлении в систему вычислительных ресурсов (ЦП, сетевых, памяти, ресурсов хранения и т. д.).
- Горизонтальное масштабирование достигается увеличением количества оборудования. В этом случае должна быть реализована возможность функционирования базы данных или приложения в распределенной вычислительной среде.
Уникальное преимущество Caché заключается в том, что система предоставляет мощные возможности вертикального и горизонтального масштабирования в готовом виде. Протокол InterSystems Enterprise Cache Protocol (ECP) представляет собой высокопроизводительную и масштабируемую технологию, благодаря которой компьютеры в распределенной системе могут пользоваться базами данных друг друга. Работа с протоколом ECP достаточно прозрачна для приложений. Приложения, предназначенные для работы на одном сервере, без каких-либо изменений функционируют в многосерверной среде.
Результаты: горизонтальное масштабирование
- Пиковая пропускная способность в нормальном режиме: 22 000 000 обращений к БД в секунду.
- Для горизонтального масштабирования использовался протокол InterSystems Enterprise Cache Protocol (ECP).
- Среда состояла из 140 вычислительных ядер на уровне сервера приложений.
- 50 000 обращений к БД в секунду/ГГц вычислений.
- Повышение масштабируемости в 3,5 раза по сравнению с Caché 2013.1.
- Повышение производительности в 2,8 раза по сравнению с Caché 2013.1.
Результаты получены при использовании модели приложения для ведения электронных медицинских карт, реальных данных и сценариев.
Результаты: вертикальное масштабирование
- Пиковая пропускная способность в нормальном режиме: 13 000 000 обращений к БД в секунду.
- Вертикальное масштабирование выполнено в рамках одной SMP-системы с 80 ядрами.
- 65 000 обращений к БД в секунду/ГГц вычислений.
- Повышение масштабируемости в 1,7 раза по сравнению с Caché 2013.1.
- Повышение производительности в 1,7 раза по сравнению с Caché 2013.1.
Результаты получены при использовании модели приложения для ведения электронных медицинских карт, реальных данных и сценариев.
Обзор
Встроенный язык программирования Caché Object Script является развитием языка программирования MUMPS. Помимо COS, Caché предоставляет разработчикам API для использования объектного и SQL-доступа к одним и тем же данным.
Caché хранит данные в многомерных массивах, способных содержать иерархически структурированные данные. Это те же «глобальные» структуры данных, что применяются в языке программирования MUMPS, развитием которого является Caché; они так же схожи со структурами, используемыми в MultiValue-системах (PICK). Тем не менее, на практике чаще всего применяются объектный и/или SQL методы доступа.
Внешние интерфейсы включают нативное присоединение объектов C++, Java, EJB, ActiveX и .NET. Caché поддерживает JDBC и ODBC для реляционного доступа. XML и web-сервисы также поддерживаются.
Технология Caché Server Pages (CSP) позволяет создавать веб-приложения, динамически генерирующие веб-страницы, с использованием данных из БД Caché. Caché также включает InterSystems Zen, модификацию AJAX, позволяющую создавать обширные веб-приложения .
Принцип «одна машина – одна кэш-память»
Еще одно различие между СУБД Caché и другими системами с распределенными кэш-памятями заключается в том, что большинство таких систем поддерживает отдельную кэш-память для каждого процесса, выполняемого на
компьютере. Например, если на одном компьютере работает восемь
приложений-клиентов, ему нужно поддерживать восемь отдельных
кэш-памятей.
В отличие от этого подхода, СУБД Caché поддерживает кэш-память в совместно
используемой памяти и дает необходимую привязку, чтобы обеспечить доступ
к нужным данным тем процессам, которые исполняются в их адресном
пространстве памяти. На рисунке 1 представлена схема доступа Caché к памяти. Доступ к данным может быть предоставлен одновременно по TCP-based протоколам, таким как JDBC, посредством языковых
привязок, а также – для достижения исключительно высокой производительности – путем привязок, которые позволяют приложениям напрямую манипулировать кэш-памятью.
Возможность использования несколькими приложениями-клиентами одной
кэш-памяти предоставляет целый ряд преимуществ. Одно из них состоит в
том, что система, дающая такую возможность, снижает требования к объему
памяти. Чтобы обеспечить работу в тех случаях, когда отдельным клиентам
(а это бывает довольно часто) требуется доступ к общим данным, системы с
распределенной кэш-памятью вынуждены поддерживать множественные
копии данных. А при использовании Caché достаточно поддерживать только
одну копию данных для каждого компьютера.
Реализация принципа «одна машина – одна кэш-память» также сокращает
объем сетевого ввода/вывода, что существенно, поскольку в случае высокопроизводительных приложений важным вопросом может оказаться поддержка сетевого трафика в контексте поддержания необходимой кэш-памяти.
В системе, работающей по принципу «одна машина – одна кэш-память», нужно
обновлять только одну кэш-память по мере изменения основных данных, а не
выполнять обновления многочисленных кэшей.
Даже в случае применения компьютеров с многоядерными процессорами,
система на базе Caché использует только одну общую область кэш-памяти для
каждого компьютера, отсюда – уровень масштабируемости, значительно
превосходящий способность расширяемости системы с распределенной
кэш-памятью. К примеру, для системы на основе Caché, установленной на
250 компьютерах, каждый из которых оснащен 8-ядерным процессором,
нужно всего лишь 250 кэш-памятей для «общения» друг с другом с целью
поддержания взаимной когерентности. Для сравнения, системам с разделенными кэш-памятями для каждого ядра требуется обеспечить согласованность
уже между 2000 кэш-памятей. При том, что процессоры современных компьютеров могут иметь восемь, шестнадцать и более ядер, преимущество Caché
становится еще более очевидным.
Рисунок 1 – Доступ к данным в Cache и в других БД
Новое ядро
Аналогом в новом ядре является класс . Основные различия в методах в том, что названия методов нового класса пишутся с прописной буквы в соответствии с новыми требования оформления кода. В остальном внешне изменений практически нет:
use \Bitrix\Main\Data\Cache, \Bitrix\Main\Loader, \Bitrix\Iblock\Component\Tools; // подключаем модуль «Информационные блоки» if (!LoaderincludeModule('iblock')) { ShowError('Модуль «Информационные блоки» не установлен'); } // тип инфоблока, откуда будем получать элемент инфоблока $iblockType = 'content'; // идентификатор инфоблока, откуда будем получать элемент $iblockId = 5; // идентификатор элемента инфоблока, который надо показать $elementId = 354; // если что-то пошло не так, эта переменная примет значение true $notFound = false; // получаем экземпляр класса $cache = CachecreateInstance(); // время кеширования в секундах $cacheTime = 3600; // формируем идентификатор кеша $cacheId = $iblockType.$elementId; if ($cache->initCache($cacheTime, $cacheId, '/another-cache-dir')) { /* * получаем закешированные переменные */ $data = $cache->getVars(); // данные об инфоблоке $iblockName = $data'iblockName'; $listPageURL = $data'listPageURL'; // данные об элементе инфоблока $elementName = $data'elementName'; $elementPicture = $data'elementPicture'; $elementPreview = $data'elementPreview'; } elseif ($cache->startDataCache()) { /* * иначе обращаемся к базе */ // данные об инфоблоке $arIblock = GetIBlock($iblockId, $iblockType); // данные об элементе инфоблока $arElement = GetIBlockElement($elementId, $iblockType); // если данные успешно получены if ($arIblock && $arElement) { $iblockName = $arIblock'NAME'; $listPageURL = $arIblock'LIST_PAGE_URL'; $elementName = $arElement'NAME'; $elementPicture = $arElement'DETAIL_PICTURE'; $elementPreview = $arElement'PREVIEW_TEXT'; // записываем полученные данные в кеш $cache->endDataCache( array( 'iblockName' => $iblockName, 'listPageURL' => $listPageURL, 'elementName' => $elementName, 'elementPicture' => $elementPicture, 'elementPreview' => $elementPreview ) ); } else { // что-то пошло не так $cache->abortDataCache(); $notFound = true; } } if (!$notFound) { // все хорошо, все данные получены // в заголовок страницы вставим название элемента $APPLICATION->SetTitle($elementName); // добавим пункт меню в навигационную цепочку $APPLICATION->AddChainItem($iblockName, $listPageURL); // выводим заголовок страницы echo '<h1>'.$elementName.'</h1>', PHP_EOL; // выводим картинку echo CFileShowImage($elementPicture, 500, 500), PHP_EOL; // выводим краткое описание echo '<p>'.$elementPreview.'</p>'; } else { // что-то пошло не так Toolsprocess404( 'Страница не найдена', true, true ); }
Файл кеша :
<? if ($INCLUDE_FROM_CACHE!='Y') return false; $datecreate = '001541325078'; $dateexpire = '001541328678'; $ser_content = 'a:2:{s:7:"CONTENT";s:0:"";s:4:"VARS";a:5:{s:10:"iblockName";s:49:"Статьи о домашних животных";s:11:"listPageURL";s:10:"/articles/";s:11:"elementName";s:29:"Ангорская кошка";s:14:"elementPicture";s:4:"1025";s:14:"elementPreview";s:473:"Ангорская кошка — порода домашних кошек, которая была создана европейскими и американскими селекционерами на основе группы особей, вывезенных из Зоопарка Анкары в середине XX века. Турецкая ангора не только умна, но и чрезвычайно адаптивна, ласкова и игрива.";}}'; return true; ?>
Очистить кеш, сохраненный в директории можно следующим образом:
$cache = \Bitrix\Main\Data\CachecreateInstance(); $cache->cleanDir('/another-cache-dir');
Очистить весь кеш (т.е. все содержимое директории ):
$cache = \Bitrix\Main\Data\CachecreateInstance(); $cache->cleanDir();
Этот код промаркирует директрии кеша на удаление:
..........
В конце названий всех директорий появится приписка из точки, тильды и длинного числа. После такой маркировки пути к файлам кеша изменятся, следовательно весь старый кеш сайта не будет восприниматься. Остаётся только все это удалить. И система сама это сделает: по агентам на хитах или кроне. Причём небольшими порциями, по несколько файлов за итерацию.
Поиск:
CMS • Web-разработка • Битрикс • Класс • Кеширование • CPageCache • CPHPCache • Cache • StartDataCache • EndDataCache • AbortDataCache • InitCache • GetVars • createInstance • cleanDir • Старое ядро • Новое ядро • Отложенные функции
Кэширование фрагментов
Кэширование фрагментов относится к кэшированию фрагментов страницы. Обычно кэширование фрагментов используйтся в представлении:
<div class="site-index"> <?php if($this->beginCache('category_list', )):?> <? foreach($categories as $category): ?> <p><?= $category->name ?></p> <? endforeach; ?> <? $this->endCache(); endif; ?> </div>
Срок хранения . По умолчанию, если срок хранения не указан . Это означает то, что время хранения бесконечен.
// Кэшированние содержимого на бесконечный срок. Если нужен срок хранения кэша, то установить нужное значение в секундах (например, 3600 = 1 час) if ($this->beginCache($id, )) { // ... здесь содержимое ... $this->endCache(); }
Зависимости :
// Отображение содержимого зависит от того, изменена или нет категория (изменения значения столбца updated_at) $dependency = ; if ($this->beginCache($id, )) { // ... здесь содержимое ... $this->endCache(); }
Вариации на примере кэширования виджета категорий:
<? //В variations нужно передать id текущей категории (для каждой категории менюшка сохраняется в отдельный параметр кэша) ?> <?php if($this->beginCache('aside-widget', [ 'duration' => 3600, //(default = 0) 'dependency' => , 'variations' => ) ? $this->params->id : null ] ])): ?> <?= CategoryWidget::widget() ?> <?php $this->endCache(); endif; ?>
Настройка кэширования для proxy_pass
Как было сказано выше, для разных методов обращения к серверу, который обрабатывает запрос, нужно использовать разные методы кэширования.
Включение кэширования
Открываем конфигурационный файл nginx:
vi /etc/nginx/nginx.conf
В секцию http добавляем:
http {
…
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:64m inactive=2h max_size=2g;
…
}
* в данном примере мы задали глобальную настройку для кэширования:
- /var/cache/nginx — путь хранения кэша.
- levels — уровень вложенности каталогов. В данном примере мы задаем настройку, при которой в каталог с кэшем будет создан каталог, а в ней — еще один каталог.
- keys_zone — имя зоны в разделяемой памяти, где будет храниться кэш, а также ее размер.
- inactive — задает время, после которого кэш будет автоматически чиститься.
- max_size — максимальный размер данных под кэш. Когда место заканчивается, nginx сам удаляет устаревшие данные.
Создаем каталог для хранения кэша и задаем владельца:
mkdir /var/cache/nginx
chown nginx:nginx /var/cache/nginx
Настройка хостов
Чтобы определенный сайт или отдельная страница кешировала запрос, открываем конфигурационный файл с настройками виртуального домена или хоста, например:
vi /etc/nginx/conf.d/default.conf
… и добавим к proxy_pass кэширование — мы получим что-то на подобие:
location / {
if ($http_cookie ~* «.+» ) {
set $cookie_cache_bypass 1;
}
proxy_cache_bypass $cookie_cache_bypass;
proxy_pass http://localhost:3000;
…
proxy_cache all;
proxy_cache_valid 404 502 503 5m;
proxy_cache_valid any 1h;
proxy_cache_use_stale error timeout invalid_header updating;
}
* где:
- set $cookie_cache_bypass 1 — задаем значения переменной $cookie_cache_bypass, если передаются куки. Необходимо для предотвращения отдачи устаревших данных.
- proxy_cache_bypass — не отдавать данные из кэша. В нашем случае, применяется при куках.
- proxy_pass — передает запросы на бэкэнд.
- proxy_cache — включаем кэширование.
- proxy_cache_valid — задает время кеширования. В нашем примере первый параметр задает кэширование страниц с кодами ответов 404, 502, 503 на 5 минут, второй — для всего остального на 1 час.
- proxy_cache_use_stale — указывает, в каких случаях можно отдать устаревший кэш.
Применение настроек
NGINX настроен. Проверим корректность настроек:
nginx -t
Если ошибок нет, применяем их:
systemctl restart nginx
Теперь заходим на сайт и смотрим в каталог с кэшем — в нем должны появиться каталоги и файлы:
ls /var/cache/nginx/
Мы должны увидеть что-то на подобие:
drwx——. 3 nginx nginx 4096 Jan 25 16:09 0
drwx——. 5 nginx nginx 4096 Jan 25 16:09 2
drwx——. 5 nginx nginx 4096 Jan 25 16:15 3
drwx——. 3 nginx nginx 4096 Jan 25 16:09 4
drwx——. 4 nginx nginx 4096 Jan 26 05:08 5
drwx——. 3 nginx nginx 4096 Jan 25 16:09 6
drwx——. 3 nginx nginx 4096 Jan 26 04:18 7
drwx——. 3 nginx nginx 4096 Jan 25 16:10 8
drwx——. 5 nginx nginx 4096 Jan 25 16:15 a
drwx——. 3 nginx nginx 4096 Jan 25 16:09 b
drwx——. 5 nginx nginx 4096 Jan 26 04:19 e
drwx——. 3 nginx nginx 4096 Jan 25 19:55 f
Список программ: сравнение, плюсы и минусы использования
Не всякий пользователь решится вручную работать с системными файлами. Для этого существуют различные программы и утилиты по обслуживанию операционной системы. Обычно их функции не ограничиваются очисткой временной памяти. Они могут работать с реестром, удалять и исправлять ошибки, предоставлять статистику и так далее. Приложения:
- ориентированы на пользователей;
- достаточно простые;
- функциональные;
- эффективные.
CCleaner
Одно из самых популярных приложений для обслуживания ОС. Оно достаточно простое в использовании, занимает мало места на жестком диске и очень функциональное:
- чистит логи приложений;
- реестр;
- временные файлы компьютера, браузеров и т.д.
Основные возможности утилиты CCleaner:
- очистка временной памяти;
- проверка реестра и исправления ошибок;
- поиск дубликатов;
- чистка оперативной памяти;
- удаление системных приложений Windows;
- полная очистка браузеров.
Плюсы:
- русскоязычный интерфейс;
- базовая версия распространяется бесплатно.
Минусы: нужно внимательно настраивать очистку, так как можно потерять сохраненные пароли и файлы cookie.
Из видео узнаете, как правильно пользоваться программой CCleaner:
Wise Disk Cleaner
Wise Disk Cleaner — простая программа для очистки жестких дисков. Этот очиститель избавляет от временных файлов, системного мусора. Имеет дружественный интерфейс.
Основные возможности:
- быстрая очистка и дефрагментация HDD;
- удаление ненужных файлов;
- очистка кэша;
- резервное копирование;
- подробный анализ неиспользуемых файлов.
Плюсы:
- не требует установки;
- быстро проводит очистку;
- понятный интерфейс;
- встроенный планировщик задач;
- совместимость с Windows 10.
Минусы: наличие рекламы в бесплатной версии.
Видео о том, как почистить компьютер от мусора программой Wise Disk Cleane:
Carambis Cleaner
Утилита Carambis Cleaner (Карамбис Клинер) предназначена не только для очистки кэша, но и для ускорения работы компьютера, но и для исправления системных ошибок.
Основные возможности:
- повышение скорости работы компьютера;
- составление отчетов об ошибках;
- мониторинг платформы Microsoft на наличие проблем и сбоев;
- планировщик задач;
- возможность работы со списком приложений как в ручном, так и в автоматическом режиме.
Плюсы:
- поддержка официального сайта;
- комплексное ускорение работы системы;
- удаление файлов-дубликатов;
- понятный интерфейс на русском языке.
Минусы: бесплатная пробная версия доступна на 30 дней.
Видео о возможностях оптимизатора Carambis Cleaner:
Reg Organizer
Программа служит для:
- полной очистки системы;
- удаления программ;
- оптимизации реестра.
Доступны:
- настройки автозапуска приложений;
- расширенная очистка кэша;
- ускорение работы ОС.
Основные возможности:
- полное удаление программ и всех компонентов;
- расширенная автоматическая очистка системы;
- редактирование и оптимизация реестра;
- тонкие настройки системы.
Плюсы:
- русский интерфейс;
- бесплатное ПО.
Минусы: программа подходит для опытных пользователей.
Видео-обзор бесплатного оптимизатора Reg Organizer:
Advanced SystemCare
Этот программный комплекс предоставляет набор утилит для ускорения и оптимизации работы компьютера. Сюда входят инструменты для очистки системы, поднятия уровня оптимизации ОЗУ и процессора.
Основные возможности:
- оптимизация системных ресурсов;
- защита от вирусов и шпионских программ;
- очистка реестра и исправление ошибок;
- ускорение производительности;
- возможность проведения дефрагментации дисков.
Плюсы:
- программа распространяется бесплатно (есть возможность приобрести лицензию с расширенным функционалом);
- поддержка русского языка.
Минусы:
- портативная версия не представлена на официальном сайте;
- для дополнительных опций необходима покупка лицензии.
Из видео узнаете, как сказать, установить и пользоваться программой Advanced SystemCare Free:
Другие приложения
Рынок приложений для обслуживания ОС очень велик, и предложенным списком не ограничивается. Портал «СофтКаталог» составил топ приложений для очистки компьютера, куда также вошли программы:
- Ускоритель Компьютера;
- Wise Care 365;
- Чистилка;
- System Mechanic;
- Glary Utilities;
- Comodo System Cleaner.
ExpiresActive Directive
Enables generation of headers |
|
server config, virtual host, directory, .htaccess | |
Indexes | |
Extension | |
mod_expires |
This directive enables or disables the generation of the
and headers for
the document realm in question. (That is, if found in an
file, for instance, it applies only to
documents generated from that directory.) If set to
, the headers will not be generated for any
document in the realm (unless overridden at a lower level, such as
an file overriding a server config
file). If set to , the headers will be added to
served documents according to the criteria defined by the
and
directives (q.v.).
Извлечение из кэша
Чтобы найти элемент в кеше, используется метод match.
cache.match(request).then((response) => console.log(request, response));
Если запрос является строкой, он сначала преобразуется в запрос путем вызова new Request(request). Функция возвращает Promise, который разрешается в Response, если найдена соответствующая запись, или undefined в противном случае.
Чтобы определить, совпадают ли два запроса, используется не только URL-адрес. Два запроса считаются разными, если они имеют разные строки запроса, заголовки Vary и/или методы (GET, POST, PUT и т. д.).
Вы можете игнорировать некоторые или все эти вещи, передавая объект параметров в качестве второго параметра.
const options = { ignoreSearch: true, ignoreMethod: true, ignoreVary: true }; cache.match(request, options).then(...);
Если более одного кэшированного запроса совпадает, возвращается тот, который был создан первым.
Если вы хотите получить все соответствующие ответы, можно использовать cache.matchAll.
const options = { ignoreSearch: true, ignoreMethod: true, ignoreVary: true }; cache.matchAll(request, options).then((responses) => { console.log(`There are ${responses.length} matching responses.`); });
Можно выполнить поиск по всем кешам одновременно, используя caches.match() вместо вызова cache.match() для каждого кеша.
Автоматическое удаление кэша при выполнении действий контроллера
Код, указанный выше обновляет кэш при действиях, указаных в поведении . Данное поведение привязано к модели, которая в свою очередь занимается ещё выборкой записей. Такой подход в данном случае не очень интнресный, поэтому мы воспользуемся методом удаления кэша из контроллера. Плюсом такого метода является то, что мы можем на нужный нам контроллер навесить нужные события и в конечном итоге модель будет заниматься только логикой (выборка данных и тд), а контроллер по событию каких-либо действий с записями удалять нужный кэш.
Файл :
<?php namespace common\components\behaviors; use Yii; use yii\base\Behavior; use yii\web\Controller; class DeleteCacheBehavior extends Behavior { public $cache_key; public $actions; public function events() { return ; } public function deleteCache() { $action = Yii::$app->controller->action->id; //название текущего действия if(array_search($action, $this->actions)=== false) return; Foreach ($this->cache_key as $id){ Yii::$app->cache->delete($id); } } }
Добавляем поведение в контроллер (у меня это ):
public function behaviors() { return [ // ... //Класс удаление кэша при выполнении указанных действий , 'actions' => , ], // ... ]; }
Кэширование запросов
Кэширование запросов — это специальная функция, построенная на основе кэширования данных. Она предназначена для кэширования результатов запросов к базе данных.
// Кэширование запросов для DAO // Возвращает ассоциативный массив с именами столбцов и значений $categories = Yii::$app->db->cache(function () { return Yii::$app->db->createCommand('SELECT * FROM `category`')->queryAll(); }); // Кэширование запросов для ActiveRecord (на 1 час) // Возвращает объект $categories = Category::getDb()->cache(function (){ return Category::find()->all(); }, 3600);
В пределах вы можете отключить кэширование запроса. В этом случае вы можете использовать :
categories = Yii::$app->db->cache(function () { // SQL запросы, которые используют кэширование Yii::$app->db->noCache(function ($db) { // SQL запросы, которые не используют кэширование }); return $categories; });
Если вы просто хотите использовать кэширование для одного запроса, вы можете вызвать при построении команды:
// использовать кэширование запросов и установить срок действия кэша на 1 час $categories = $db->createCommand('SELECT * FROM category)->cache(3600)->queryAll();
Можете использовать для отключения кэширования запросов для одной команды:
$result = $db->cache(function ($db) { // ... Используется кэширование SQL запросов ... // не использовать кэширование запросов для этой команды $categories = $db->createCommand('SELECT * FROM category)->noCache()->queryAll(); // ... return $result; });
Параметры файла подкачки
Иногда наряду с изменением размера кэша в сторону увеличения некоторые специалисты рекомендуют произвести дополнительные действия с так называемым файлом подкачки, который отвечает за работу и использование виртуальной памяти – такого же резервируемого объема на жестком диске, но используемого для выгрузки программных компонентов в случае нехватки оперативной памяти. Как и в случае с системным кэшем, нужно быть предельно осторожным. При малом объеме ОЗУ файл подкачки действительно можно немного увеличить, установив для него значение, которое в 1,5-2 раза превышает определяемое или рекомендуемое системой по умолчанию. Но и тут следует помнить, что при установке слишком большого объема можно добиться обратного эффекта, когда программы в приоритете будут производить обращение не к оперативной, а к виртуальной памяти. Повторимся: скорость доступа к винчестеру ниже, чем к планкам ОЗУ. Из-за этого мы получаем торможение программ при запуске или в процессе работы.
Негласно считается, что при установленных объемах оперативной памяти на уровне 8 Гб и более файл подкачки можно отключить вовсе, что никаким образом не скажется на работоспособности системы в отрицательную сторону. Наоборот, иногда можно добиться повышения производительности.
Что можно хранить в кеше
Кэш хранит только пары объектов Request и Response, представляющих HTTP-запросы и ответы соответственно. Однако запросы и ответы могут содержать любые данные, которые можно передавать по HTTP.
Можно создать объект Request, используя URL для сохранения в кеше:
const request = new Request('/images/sample1.jpg');
Конструктор объекта Response принимает разные типы данных, включая Blobs, ArrayBuffers, объекты FormData и строки.
const imageBlob = new Blob(, {type: 'image/jpeg'}); const imageResponse = new Response(imageBlob); const stringResponse = new Response('Hello world');
Можно установить MIME тип Response, установив соответствующий заголовок.
const options = { headers: { 'Content-Type': 'application/json' }} const jsonResponse = new Response('{}', options);
Инициализация хранилища
Начнем с инициализации нового контейнера-хранилища:
Инициализация нового экземпляра кеша принимает два аргумента: и
- — время жизни кеша по-умолчанию, если установлено значение меньше или равно 0 — время жизни кеша бессрочно.
- — интервал между удалением просроченного кеша. При установленном значении меньше или равно 0 — очистка и удаление просроченного кеша не происходит.
На выходе получаем контейнер со структурой
Будьте внимательны при установке этих параметров, слишком маленькие или слишком большие значения могут привести к нежелательным последствиям, например если установить поиск просроченных ключей будет происходить каждую секунду, что негативно скажется на производительности вашей программы. И наоборот установив — в памяти будет накапливаться неиспользуемые элементы.