Кэширование памяти (часто называемое просто кэшированием) - это метод, при котором компьютерные приложения временно хранят данные в основной памяти компьютера (т.е. в памяти с произвольным доступом, или ОЗУ), чтобы обеспечить быстрый поиск этих данных.
Оперативная память, используемая для временного хранения данных, называется кэшем. Поскольку доступ к оперативной памяти значительно быстрее, чем к другим носителям, таким как жесткий диск или сеть, кэширование помогает приложениям работать быстрее за счет более быстрого доступа к данным. Кэширование особенно эффективно, когда приложение демонстрирует общий шаблон, при котором оно неоднократно обращается к данным, к которым уже обращалось ранее. Кэширование также полезно для хранения вычислений, которые в противном случае требуют много времени. Храня вычисления в кэше, система экономит время, избегая повторения вычислений.
Как работает кэширование памяти?
Кэширование памяти работает путем выделения части оперативной памяти для использования в качестве кэша. Когда приложение пытается прочитать данные, обычно из системы хранения данных, например, из базы данных, оно проверяет, существует ли нужная запись в кэше. Если да, то приложение считывает данные из кэша, тем самым устраняя более медленный доступ к базе данных. Если нужной записи нет в кэше, то приложение считывает запись из источника. Получив данные, оно также записывает их в кэш, чтобы в будущем, когда приложению понадобятся те же данные, оно могло быстро получить их из кэша.
Поскольку размер кэша ограничен, в конечном итоге некоторые данные, уже находящиеся в кэше, придется удалить, чтобы освободить место для новых данных, к которым приложение обращалось совсем недавно. Это означает, что системе кэширования нужна стратегия, какие записи удалять, чтобы освободить место. Стратегия зависит от характера доступа приложения к данным, и обычно старается удалять записи, к которым в ближайшее время не ожидается повторного обращения. Например, стратегия наименее частого использования (LRU) удалит запись, последний доступ к которой был раньше, чем к любой другой записи в кэше. Здесь предполагается, что если с момента обращения к записи прошло много времени, то, скорее всего, в ближайшее время к ней больше не обратятся. Или, говоря иначе, записи, которые использовались в последнее время чаще всего, скорее всего, не будут использоваться в ближайшее время. Стратегия наименее частого использования (LFU) подразумевает отслеживание количества обращений к каждой записи в кэше и удаление записи с наименьшим количеством обращений. Здесь предполагается, что редко используемая запись, скорее всего, не будет использоваться снова в ближайшее время.
Проблемы с кэшем
Проблема с кэшем заключается в том, как минимизировать "промахи кэша", то есть попытки чтения приложением записей, которых нет в кэше. Если у вас слишком много промахов, эффективность кэша снижается. Приложение, которое считывает только новые данные, не выиграет от наличия кэша и, более того, продемонстрирует более низкую производительность из-за дополнительной работы по проверке кэша и ненахождению в нем нужной записи. Одним из способов решения этой проблемы является использование больших кэшей. На одном компьютере это часто нецелесообразно, поэтому распределенные кэши являются популярным выбором для ускорения работы приложений, которым требуется доступ к большим наборам данных. Распределенный кэш объединяет оперативную память нескольких компьютеров, объединенных в кластер, что позволяет создать более крупный кэш, который может продолжать расти за счет добавления новых компьютеров в кластер. Такие технологии, как Hazelcast IMDG, можно использовать в качестве распределенного кластера для ускорения крупномасштабных приложений.
Еще одной проблемой кэшей является риск чтения "несвежих" данных, когда данные в кэше не отражают последние данные в базовом источнике. Зачастую этот риск является приемлемым компромиссом ради производительности приложения. В тех случаях, когда это не так, приложение, которое обновляет базовый источник данных, должно обновить соответствующую запись в кэше.
Примеры использования
Одним из основных вариантов использования кэширования памяти является ускорение приложений баз данных, особенно тех, которые выполняют много чтений из базы данных. Заменяя часть операций чтения из базы данных на операции чтения из кэша, приложения могут устранить задержки, возникающие при частом обращении к базе данных. Этот вариант использования обычно встречается в средах, где наблюдается большой объем обращений к данным, например, на веб-сайте с высокой посещаемостью и динамическим содержимым из базы данных.
Другой вариант использования связан с ускорением запросов, когда результаты сложного запроса к базе данных хранятся в кэше. Сложные запросы, выполняющие такие операции, как группировка и упорядочивание, могут занимать значительное время. Если запросы выполняются многократно, как в случае с приборной панелью бизнес-аналитики (BI), к которой обращаются многие пользователи, хранение результатов в кэше позволит повысить скорость отклика в этих приборных панелях.