Как записать кэш-память

Обновлено: 22.11.2024

Пока что мы отследили последовательности адресов памяти, которые работают следующим образом, если вы позволите мне немного антропоморфизировать:

  1. Процессор спрашивает подсистему памяти: "Привет, у вас есть данные по адресу XXX?"
  2. Кэш L1 сначала решает этот вопрос, проверяя действительный бит и тег любых блоков, которые могут содержать данные адреса XXX.
  3. Произойдет одно из двух:
  4. Попадание: если L1 определяет, что в данный момент он хранит данные адреса XXX, тогда L1 без проблем возвращает эти данные процессору (и обновляет свою собственную информацию LRU, если применимо).

Промах: если L1 определяет, что у него нет данных адреса XXX, он начинает взаимодействие со следующим уровнем иерархии (вероятно, с кэшем L2). Диалог между L1 и L2 очень похож на диалог между процессором и L1, который мы описали до сих пор.

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

На протяжении всего этого процесса мы делаем некоторые скрытые неявные предположения, которые действительны для чтения, но сомнительны для записи. Мы назовем их Подлые предположения 1 и 2:

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

Подлое предположение 2: если доступ отсутствует, нам абсолютно необходимо получить эти данные с другого уровня иерархии, прежде чем наша программа сможет продолжить работу.

Почему эти предположения справедливы для операций чтения:

Подлое предположение 1: перенос данных в L1 (или L2, или что-то еще) означает просто создание копии версии в основной памяти. Если мы потеряем эту копию, у нас все еще будут данные где-то.

Подлое предположение 2. Если запрос является нагрузкой, процессор запросил некоторые данные у подсистемы памяти. Чтобы выполнить этот запрос, подсистема памяти обязательно должна найти эти данные, где бы они ни находились, и вернуть их процессору.

Почему эти предположения сомнительны для авторов:

Скрытое предположение 1. Давайте подумаем о данных, которые заменяются (технический термин вытесняется), когда мы вводим новые данные. Если некоторые обращения к старым данным были записями, по крайней мере возможно, что версия старых данных в нашем кеше несовместима с версиями на более низких уровнях иерархии. Мы хотели бы быть уверены, что нижние уровни знают об изменениях, которые мы внесли в данные в нашем кеше, прежде чем просто перезаписать этот блок другими данными.

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

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

Впереди еще больше дикого антропоморфизма.

Представьте, что вы кэш L1 (хотя это обсуждение распространяется и на другие уровни). Процессор отправляет вам запрос на запись для адреса XXX, данные которого вы уже храните (запись). По запросу вы изменяете данные в соответствующем блоке кэша L1.

О нет! Теперь ваша версия данных по адресу XXX несовместима с версией на последующих уровнях иерархии памяти (L2, L3, основная память)! Поскольку вы заботитесь о сохранении правильности, у вас есть только два реальных варианта:

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

Вариант 2. Обратная запись. У вас более свободные отношения с L2. Ваши обсуждения основаны на необходимости знать. Вы спокойно отслеживаете, что этот блок вы модифицировали. Если вам когда-нибудь понадобится вытеснить блок, именно тогда вы, наконец, расскажете L2, что случилось.

Детали реализации сквозной записи (наивная версия)

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

Это означает, что попадание записи на самом деле действует как промах, так как вам потребуется доступ к L2 (и, возможно, к другим уровням, в зависимости от того, какова политика записи L2 и является ли L2 доступ является удачным или неудачным).

Это не весело и серьезно снижает производительность.

Детали реализации сквозной записи (более умная версия)

Вместо того, чтобы ждать, пока запись L2 полностью не завершится, вы добавляете немного дополнительного хранилища в L1, называемое буфером записи. Задача буфера записи — отслеживать все ожидающие обновления для L2, чтобы L1 мог продолжать свою жизнь.

Эта оптимизация возможна, потому что для операций сквозной записи на самом деле не требуется никакой информации из L2; L1 нужно просто гарантировать, что запись будет выполнена.

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

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

Подробности реализации обратной записи

Пока мы получаем записи в определенный блок, мы ничего не сообщаем L2. Вместо этого мы просто устанавливаем бит метаданных L1 (грязный бит — технический термин!), чтобы указать, что этот блок теперь несовместим с версией в L2.

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

Всякий раз, когда мы пропускаем грязный блок и вносим новые данные, нам фактически нужно сделать два доступа к L2 (и, возможно, к более низким уровням):

  • Один, чтобы сообщить об измененных данных в грязном блоке. Мы будем рассматривать это как штраф за промах L1.
  • Другой, чтобы получить фактически пропущенные данные. Мы будем рассматривать это как второй штраф за промах.

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

Снова представьте (без ограничения общности), что вы кэш L1. Вы получаете запрос на запись от процессора. Ваша единственная обязанность перед процессором — убедиться, что последующие запросы на чтение по этому адресу видят новое значение, а не старое. Вот и все.

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

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

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

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

Запись-распределение

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

Сложная часть: если блоки кеша больше, чем запрошенный объем данных, у вас возникнет дилемма. Будете ли вы запрашивать у L2 данные в остальной части блока (которые вам пока даже не нужны!), или нет? Это приводит к еще одному дизайнерскому решению:

  • Выборка-при-записи. Если кэш является выборкой-при-записи, то промах записи L1 инициирует запрос к L2 для извлечения остальной части блока. Этот запрос чтения на L2 является дополнением к любой операции сквозной записи, если это применимо.
  • Без выборки при записи. Если кеш не поддерживает выборку при записи, то вот как работает промах записи: L1 заполняет только часть записываемого блока и не запрашивает L2 об этом. помогите заполнить остальные. Это устраняет накладные расходы на чтение L2, но требует несколько допустимых битов на строку кэша, чтобы отслеживать, какие части были фактически заполнены.

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

Запретить запись-распределение

Это именно то, на что это похоже! Если у вас есть промах записи в кэше no-write-allocate, вы просто уведомляете следующий уровень вниз (аналогично операции сквозной записи). Вы ничего не удаляете из собственного кеша.

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

Необходимое условие — организация многоуровневого кэша.
Кэш — это метод временного хранения копии данных в быстродоступной памяти. Кэш хранит последние использованные слова в небольшой памяти, чтобы увеличить скорость доступа к данным. Он действует как буфер между ОЗУ и ЦП и, таким образом, увеличивает скорость, с которой данные доступны процессору.

Всякий раз, когда процессор хочет записать слово, он проверяет, присутствует ли адрес, по которому он хочет записать данные, в кэше или нет. Если адрес присутствует в кеше, т.е. Write Hit.

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

Проходная запись:

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

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

Ответить:

Данные обновляются только в кеше и обновляются в памяти позднее. Данные в памяти обновляются только тогда, когда строка кеша готова к замене (замена строки кеша выполняется с использованием аномалии Белади, алгоритма наименее недавно использованного, FIFO, LIFO и других в зависимости от приложения).
Отложенная запись также называется отложенной записью.

Грязный бит: каждому блоку в кеше нужен бит, чтобы указать, были ли данные, присутствующие в кеше, изменены (грязные) или не изменены (чистые). Если он чистый нет необходимости записывать его в память. Он предназначен для сокращения операций записи в память. В случае сбоя кэша, сбоя системы или отключения электроэнергии измененные данные будут потеряны. Потому что восстановить данные из кеша в случае утери практически невозможно.

Если запись происходит в расположение, отсутствующее в кэше (промах записи), мы используем два варианта: «Запись в выделение» и «Запись вокруг».

Распределение записи:

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

Обозначение:

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

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

Нам все еще нужно дождаться памяти в «позднее время», так что в чем преимущество «сквозной записи»?

@wlnirvana Да, вы правы, это моя канцелярская ошибка. Я бы удалил его и добавил здесь новый комментарий, чтобы в будущем не вводить в заблуждение.

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

Я вижу, что дан поясняющий ответ. Советую посмотреть тэги Write-Allocate, Write-NoAllocate после того, как расскажу об алгоритме обратной записи.

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

5 ответов 5

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

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

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

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

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

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

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

Сквозная запись: запись выполняется синхронно как в кэш, так и в резервное хранилище.

Обратная запись (или отложенная запись): запись выполняется только в кэш. Измененный блок кэша записывается обратно в хранилище непосредственно перед его заменой.

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

Обратная запись: когда данные обновляются, они записываются только в кеш. Измененные данные записываются во внутреннее хранилище только тогда, когда данные удаляются из кэша. Этот режим имеет высокую скорость записи данных, но данные будут потеряны, если произойдет сбой питания до того, как обновленные данные будут записаны в хранилище.

Я не понимаю объяснение из самого последнего предложения. При сбое питания DRAM также потеряет данные независимо от сквозной или обратной записи, так что это не должно быть проблемой, связанной с обратной записью.

@gustafbstrom Я думаю, что это объяснение с точки зрения ОЗУ/диска, а не кеша/ОЗУ. Однако концепция та же.

@gustafbstrom Обратная запись более опасна, если у вас пропало питание и в кэше нет резервного аккумулятора. Дело в том, что сквозная запись также может привести к потере данных. Я думаю, что самый безопасный способ — отключить все кэширование записи и использовать только кэширование чтения.

Давайте рассмотрим это на примере. Предположим, у нас есть кэш с прямым отображением и используется политика обратной записи. Итак, у нас есть допустимый бит, грязный бит, тег и поле данных в строке кэша. Предположим, у нас есть операция: запись A (где A отображается в первую строку кеша).

Происходит следующее: данные (A) от процессора записываются в первую строку кэша. Действительный бит и биты тега установлены. Грязный бит установлен на 1.

Грязный бит просто указывает, была ли когда-либо записана строка кэша с тех пор, как она была в последний раз помещена в кэш!

Теперь предположим, что выполняется другая операция: чтение E (где E также отображается в первую строку кэша)

Поскольку у нас кэш с прямым отображением, первую строку можно просто заменить блоком E, который будет извлечен из памяти. Но поскольку последний записанный в строку блок (блок A) еще не записан в память (обозначается грязным битом), поэтому контроллер кеша сначала выполнит обратную запись в память, чтобы передать блок A в память, затем он заменит строку блоком E, выполнив операцию чтения в память. грязный бит теперь равен 0.

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

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

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

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

Обратная запись: информация записывается в блок в кэше. Измененный блок кэша записывается в память только при замене (по сути, отложенная запись). Специальный бит для каждого блока кэша, грязный бит, отмечает, был ли блок кэша изменен во время нахождения в кэше. Если грязный бит не установлен, блок кеша является «чистым», и ошибка записи не приводит к записи блока в память.

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

Правила для промаха записи подробно описаны в моей первой ссылке.

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

Один из технических вопросов, которые нам задают на Flashbay, касается кэширования записи. В нашем последнем блоге подробно рассказывается, что такое кэширование записи и как оно работает.

Кэширование записи — это процесс, при котором устройство не сразу завершает запись файла, а вместо этого кэширует некоторую его часть для последующего завершения. Когда запоминающее устройство USB вставлено в компьютер, данные могут быть как записаны на него, так и считаны с него. Чтобы повысить производительность своей системы, компьютер может использовать свою быструю энергозависимую память (ОЗУ) для сбора команд записи, отправленных на USB-накопитель, и «кэшировать» их до тех пор, пока более медленное внешнее запоминающее устройство не сможет быть записано позже. Тогда другие приложения смогут работать быстрее, не дожидаясь, пока внешнее запоминающее устройство обработает запросы на запись данных.

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

Настройки Windows по умолчанию фактически отключают «Кэширование записи», чтобы обеспечить быстрое удаление внешних устройств без использования значка «Безопасное извлечение устройства». Однако, как сторонники производительности, мы бы посоветовали использовать эту функцию.

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

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

Кэширование памяти (часто называемое просто кэшированием) – это метод, при котором компьютерные приложения временно сохраняют данные в основной памяти компьютера (т. е. в оперативной памяти или ОЗУ), чтобы обеспечить быстрое извлечение этих данных. Оперативная память, используемая для временного хранения, называется кешем. Поскольку доступ к ОЗУ значительно быстрее, чем доступ к другим носителям, таким как жесткие диски или сети, кэширование помогает приложениям работать быстрее благодаря более быстрому доступу к данным. Кэширование особенно эффективно, когда приложение демонстрирует общий шаблон, в котором оно неоднократно обращается к данным, к которым ранее обращались. Кэширование также полезно для хранения вычислений данных, которые в противном случае требуют много времени для вычислений. Сохраняя вычисления в кэше, система экономит время, избегая повторения вычислений.

Обзор кэширования памяти

Как работает кэширование памяти?

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

Поскольку размер кеша ограничен, со временем некоторые данные, уже находящиеся в кеше, придется удалить, чтобы освободить место для новых данных, к которым приложение обращалось последним. Это означает, что системе кэширования нужна стратегия удаления записей для освобождения места. Стратегия будет зависеть от характера доступа к данным приложения и, как правило, будет пытаться удалить записи, к которым не ожидается повторного доступа в ближайшее время. Например, стратегия наименее недавно использованных (LRU) удалит запись, последний доступ к которой был до любой другой записи в кэше. Здесь предполагается, что если с момента обращения к записи прошло много времени, то, скорее всего, к ней скоро не будут обращаться снова. Или, другими словами, записи, которые чаще всего использовались в последнее время, скорее всего, скоро будут использоваться снова. Стратегия наименее часто используемого (LFU) предполагает отслеживание количества обращений к каждой записи в кэше и удаление записи с наименьшим количеством обращений. Здесь предполагается, что редко используемая запись вряд ли будет использоваться снова в ближайшее время.

Проблема с кешем заключается в том, как свести к минимуму «промахи кеша», т. е. попытки считывания приложением записей, которых нет в кеше. Если у вас слишком много промахов, эффективность вашего кеша снижается. Приложение, которое только читает новые данные, не выиграет от кеша и фактически будет демонстрировать более низкую производительность из-за дополнительной работы по проверке кеша, но не находит в нем нужную запись. Одним из способов решения этой проблемы является использование больших кешей. Это часто нецелесообразно на одном компьютере, поэтому распределенные кэши являются популярным выбором для ускорения работы приложений, которым необходим доступ к большим наборам данных. Распределенный кэш-память объединяет оперативную память нескольких компьютеров, подключенных к кластеру, так что вы можете создать больший кэш, который может продолжать расти, добавляя в кластер новые компьютеры. Такие технологии, как Hazelcast IMDG, можно использовать в качестве распределенного кластера для ускорения крупномасштабных приложений.

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

Примеры использования

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

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

Читайте также: