Основы серверной разработки: технология кэширования, которую должен освоить каждый программист
Основы серверной разработки: технология кэширования, которую должен освоить каждый программист
В данной статье описана кэш-технология, используемая в Бэкэнд-разработка.,Например, стратегия кэша, тип кэша.,Включая локальный кэш и распределенный кэш.,Также существует стратегия устранения кэша.,И распространенные проблемы при использовании кэша,Такие как проблемы согласованности, кэшлавина, кэшпроникновение, Кэш. Прорыв.

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

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

Кэширование в фоновом режиме

В серверной разработке сценарии использования кэша обычно включают в себя:

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

01. Стратегия кэширования

Стратегии кэширования обычно делятся на два типа: кэширование со сквозным чтением и обходное кэширование.

1.1 Кэш чтения

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

Существует множество приложений для чтения кэша, например CDN:

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

Tencent Cloud CDN обладает такими преимуществами продукта, как огромные резервы ресурсов, глобальное интеллектуальное планирование, доступ одним щелчком мыши и богатые функции. Предприятия и пользователи могут узнать и опробовать его: https://cloud.tencent.com/product/. CDN

Источник изображения: seobility

1.2 Кэш-кэш

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

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

02. Тип кэша

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

2.1 Локальный кэш (локальный кэш)

Локальный кэш имеет тот же жизненный цикл, что и процесс приложения, и хранится в куче приложения.

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

2.2 Распределенный кеш (удаленный кеш)

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

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

2.2.1 Общие службы кэширования

Redis

  • Поддерживает несколько структур данных,Например: список,set,zset,hash ждатьданныеструктура。
  • Поддерживает сохранение и восстановление данных.
  • Поддерживает несколько режимов кластера: репликацию «главный-подчиненный», дозорный режим и режим кластера для обеспечения высокой доступности, аварийного восстановления и простоты расширения.
  • Может обеспечить скорость реакции на уровне миллисекунд.
  • Redis 6.0 представляет многопоточный ввод-вывод, который ранее был однопоточной моделью.

Memcache

  • В основном поддерживает простое хранилище пар ключ-значение.
  • Сохранение и восстановление не поддерживаются.
  • Кластер: Распределенное хранилище может быть достигнуто посредством сегментирования клиента.
  • Многопоточный неблокирующий режим ввода-вывода.
  • Может обеспечить скорость реакции на уровне миллисекунд.

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

03. Стратегия устранения кэша

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

3.1 FIFO (первым пришел – первым обслужен).

Алгоритм FIFO является самым простым и понятным. Его стратегия: первым поступил — первым отправлен. Чем раньше записывается фрагмент данных, тем ниже вероятность доступа к нему в будущем. Поэтому алгоритм FIFO отдает приоритет удалению самых старых записанных данных.

3.2 LRU (наименее используемый в последнее время).

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

3.3 LFU (наименее часто используемый).

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

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

04. Часто задаваемые вопросы о кэшировании

4.1 Согласованность между кешем и источником данных

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

4.1.1 Срок действия и срок действия

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

4.1.2 Активные обновления

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

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

4.2 Лавина кэша

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

Обычно существует две причины лавин кэша:

  • Один — это много кэша key истекает одновременно
  • Во-вторых, кэш Служить недоступен.,Запросы прозрачно передаются в библиотеку данных.

Решение:

  • Установите разумный срок истечения: Установите разумный срок истечения,Срок действия дисперсионного кэша,Избегайте кэшистекает одновременно。
  • Обеспечьте высокую доступность кэш Служить: используйте независимый кэш Служить,Попробуйте использовать кэш-кластеры,Обеспечить высокую доступность и аварийное восстановление кэш Служить.

4.3 Проникновение в кэш

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

Причины проникновения кэша обычно включают в себя:

  • Разумная проверка и перехват параметров запроса не производятся.
  • Атакуется тщательно созданными вредоносными запросами.

Решение:

  • Установите разумную проверку параметров: установив разумные правила проверки, такие как диапазон идентификаторов, правила регулярности имен и т. д., фильтруйте и перехватывайте необоснованные или нулевые параметры запроса.
  • Обработка значений кэшаnull: даже если источник данных возвращает нулевое значение,Также сохраните его в слое кэша. Возможно, установите несколько флагов для его значения.,Например, значение=-1 и т. д.,Для Служить удобно распознавать нулевое значение. в то же время,Вы также можете установить более короткий срок действия для нулевых значений.

4.4 Разбивка кэша

кэш Разбивка относится кАннулирование кеша данных точки доступаПонятно,Затем происходит большое количество запросов на доступ к хот-споту одновременно.,Из-за отказа кэша,Эти запросы прозрачно передаются исходным данным одновременно.,Вызывает повышенную нагрузку на источник данных.,Даже крах.

Причина поломки кеша обычно следующая: при сбое кеша «горячих» данных к данным одновременно обращаются многочисленные одновременные запросы.

Решение:

  • Используйте мьютексы или распределенные блокировки.,Блокировка операции возврата к исходному состоянию данных,Гарантируется, что источнику данных Служить одновременно прозрачно передается только один запрос.
  • Кэш данных и кэш активных обновлений.
  • Предварительная загрузка данных Hotspot: когда истекает срок действия кэшданных,по фону Служить Активное Обновите горячую точку, предотвратите потерю эффекта.

05. Резюме

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

-End-

Оригинальный автор | Тан Гофу

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose