Кэш — это технология хранения, позволяющая хранить данные так, чтобы их можно было быстро получить. Наиболее важными функциями кэша являются две: хранение и быстрое извлечение. Суть кэширования: «Обмен пространства на время», использование быстрых носителей для сохранения данных для увеличения скорости доступа к данным.
В компьютерном мире кеш широко используется в аппаратном обеспечении (например, кеш ЦП, регистры) и программном обеспечении (например, кеш браузера, CDN, кеш в приложениях и т. д.).
Кэширование в фоновом режиме
В серверной разработке сценарии использования кэша обычно включают в себя:
Стратегии кэширования обычно делятся на два типа: кэширование со сквозным чтением и обходное кэширование.
1.1 Кэш чтения
При использовании кэша со сквозным чтением приложение пытается получить данные из кэша. Если данные уже существуют в кеше, кеш вернет данные напрямую. Если кеш не содержит необходимых данных, кеш обратится к источнику данных для получения данных, вернет полученные данные приложению и сохранит данные в кеше. Таким образом, когда приложению в следующий раз понадобятся те же данные, их можно будет получить непосредственно из кэша сквозного чтения без необходимости повторного доступа к источнику данных.
Существует множество приложений для чтения кэша, например CDN:
CDN (сеть доставки контента) — это сеть распространения контента, имеющая распределенную сетевую архитектуру. Опираясь на широко распространенные в разных местах серверы CDN, предоставляемые поставщиками услуг, путем распределения и кэширования данных на серверах CDN в разных местах, когда пользователь запрашивает данные, CDN будет сопоставлять ближайший к пользователю узел и возвращать кэшированные данные. скорость, с которой пользователи получают доступ к ресурсам. CDN обычно используется для ускорения передачи статических ресурсов, таких как изображения, CSS, HTML и другой контент. Динамический контент, такой как результаты поиска, информация о документе и т. д., не подходит. Этот тип данных требует вычислений в реальном времени сервером приложений, прежде чем их можно будет вернуть.
Tencent Cloud CDN обладает такими преимуществами продукта, как огромные резервы ресурсов, глобальное интеллектуальное планирование, доступ одним щелчком мыши и богатые функции. Предприятия и пользователи могут узнать и опробовать его: https://cloud.tencent.com/product/. CDN
Источник изображения: seobility
1.2 Кэш-кэш
В отличие от кэширования со сквозным чтением, обходное кэширование не работает напрямую с источником данных. Приложение пытается получить данные из обходного кэша и возвращает значение NULL, если данные не существуют. Приложение само запрашивает источник данных для получения данных и записывает их в обходной кеш. Таким образом, в следующий раз, когда поступит тот же запрос, приложение получит данные из обходного кэша.
Вообще говоря, две стратегии кэширования чтения и кэширования обхода применяются гибко и являются взаимодополняющими. Например, в кэше со сквозным чтением стратегия обхода кэша используется для запроса данных и кэша записи. Реализация инкапсулирована в целом, а внешняя производительность — это стратегия кэширования со сквозным чтением.
В фоновых службах типы кэша можно разделить на локальный и распределенный.
2.1 Локальный кэш (локальный кэш)
Локальный кэш имеет тот же жизненный цикл, что и процесс приложения, и хранится в куче приложения.
2.2 Распределенный кеш (удаленный кеш)
Распределенный кеш также можно понимать как удаленный кеш. Используйте внешние службы кэширования, развертывайте независимо и отделяйте их от приложений.
2.2.1 Общие службы кэширования
Redis
Memcache
Выбор Redis или Memcached зависит от потребностей вашего конкретного приложения. Если вам нужно легкое решение, ориентированное на кэширование, которое не требует сложных типов данных и устойчивости, Memcached может быть более подходящим выбором. А если приложению необходимо использовать преимущества богатых типов данных, постоянства и построить высокодоступную распределенную систему, Redis будет более мощным и гибким выбором.
Поскольку пространство кэша ограничено, если медленное пространство израсходовано, старые данные необходимо удалить, чтобы освободить место для новых данных. Ниже приведены некоторые часто используемые стратегии вытеснения кэша.
3.1 FIFO (первым пришел – первым обслужен).
Алгоритм FIFO является самым простым и понятным. Его стратегия: первым поступил — первым отправлен. Чем раньше записывается фрагмент данных, тем ниже вероятность доступа к нему в будущем. Поэтому алгоритм FIFO отдает приоритет удалению самых старых записанных данных.
3.2 LRU (наименее используемый в последнее время).
Алгоритм LRU, наименее используемый алгоритм. Если к фрагменту данных обращались недавно, вероятность обращения к нему в будущем выше. Напротив, если к фрагменту данных не было доступа в течение длительного времени, вероятность доступа в будущем будет ниже. Стратегия исключения заключается в том, чтобы сначала удалить данные, которые не использовались в течение длительного времени. LRU обычно реализуется с использованием двусвязного списка + хеш-таблицы.
3.3 LFU (наименее часто используемый).
Алгоритм LFU является наименее используемым алгоритмом. Если к фрагменту данных обращаются большее количество раз, вероятность доступа к нему в будущем выше. Напротив, если к фрагменту данных обращаются реже, вероятность доступа к нему в будущем меньше. Стратегия исключения заключается в том, чтобы сначала удалить наименее используемые данные. Алгоритм LFU можно реализовать с использованием небольшой верхней кучи + хэш-таблицы.
Большинство сторонних библиотек или служб кэширования для локального кэширования поддерживают алгоритмы исключения настроек, поэтому нет необходимости реализовывать их самостоятельно.
4.1 Согласованность между кешем и источником данных
Кэшированные данные поступают из источника данных. Когда источник данных обновляется, но кеш не обновляется, фоновая служба извлекает грязные данные из кеша, что вызывает проблему чтения грязных данных. Есть две основные стратегии решения этой проблемы.
4.1.1 Срок действия и срок действия
Для каждых данных, записанных в кэш, устанавливается соответствующий срок действия, и кэшированные данные возвращаются в течение срока действия. По истечении срока действия кэшированных данных они будут возвращены в источник данных, и последние данные будут кэшированы снова. В этом случае возникнет проблема некорректного чтения данных. Однако, если используются данные с истекшим сроком действия, обычно это данные, которые не обновляются часто, например информация пользователя, популярная информация и т. д. Определенная задержка данных приемлема.
4.1.2 Активные обновления
Когда данные в источнике данных обновляются, программа активно обновляет кэшированные данные, чтобы гарантировать, что данные в кэше всегда актуальны. Эта стратегия подходит для данных, требующих высокой своевременности данных, таких как запасы, остатки и т. д. Платой за активное обновление является увеличение сложности кода. Все операции, связанные с обновлением данных, требуют обновления их кэшированных данных.
Независимо от того, связано ли это с истечением срока действия или активным обновлением, вам следует сначала проанализировать, предъявляет ли текущий сценарий высокие требования к своевременности данных? Если нет, то срока годности достаточно. Если да, то вам необходимо взвесить, приемлема ли стоимость активных обновлений, например, повышенная сложность кода. В противном случае, можем ли мы пойти на компромисс, сократив время отказа и приняв стратегию отказа с истекшим сроком действия?
4.2 Лавина кэша
кэшлавинаотносится к фону в тот же момент времени СлужитьвСрок действия большого количества кэшей истек и истек.когда Служить Когда количество параллелизма очень велико,Большое количество запросов данных поступает к источнику данных Служить одновременно (например, библиотека данных или другой Служить).,Вызывает увеличение мгновенной нагрузки источника данных Служить,Даже крах.
Обычно существует две причины лавин кэша:
Решение:
4.3 Проникновение в кэш
Проникновение кэша означает, что большое количество запросов с нулевыми значениями одновременно поступает в фоновую службу. Запросы с нулевыми значениями относятся к запросам без данных после запроса к источнику данных. Поскольку источник данных возвращает нулевые данные, уровень кэша не сохраняет их. нулевые значения, что приводит к запросам нулевых значений. Он неизбежно проникнет на уровень кэша и будет прозрачно передан источнику данных.
Причины проникновения кэша обычно включают в себя:
Решение:
4.4 Разбивка кэша
кэш Разбивка относится кАннулирование кеша данных точки доступаПонятно,Затем происходит большое количество запросов на доступ к хот-споту одновременно.,Из-за отказа кэша,Эти запросы прозрачно передаются исходным данным одновременно.,Вызывает повышенную нагрузку на источник данных.,Даже крах.
Причина поломки кеша обычно следующая: при сбое кеша «горячих» данных к данным одновременно обращаются многочисленные одновременные запросы.
Решение:
В этой статье подробно описывается технология кэширования при фоновой разработке, и мы надеемся, что она окажется полезной и вдохновит вас на повседневную работу. Для программистов крайне важно владеть различными стратегиями и механизмами кэширования и решать проблемы кэширования, что может значительно повысить эффективность, стабильность и удобство работы с серверной частью разработки.
-End-
Оригинальный автор | Тан Гофу