Здравствуйте, давайте поговорим о кеше, какие типы кеша существуют и как мы можем их использовать в .NET Core.

Что такое кеш?

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

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

Типы кэширования в .NET Core

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

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

In-Memory Cache имеет недостатки, что произойдет с данными, если этот сервер перезагрузится или выйдет из строя? Очевидно, что они исчезнут :) Конечно, это может быть полезно на этапе разработки, но в продакшене такое поведение неприемлемо.

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

Существует один метод работы с In-Memory Cache — липкие сеансы. Прикрепленные сеансы означают, что один сеанс всегда направляется на один конкретный сервер за балансировщиком нагрузки.

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

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

Примеры узлов для хранения распределенного кеша: База данных SQL Server, Azure Redis Cache, NCache и т. д.

Как использовать кэш в памяти в .NET Core?

Прежде всего, давайте создадим, например, проект API.

Затем нам нужно добавить кэш памяти к зависимостям в Startup.cs.

Хорошо, теперь мы можем использовать IMemoryCache в нашем решении.

С помощью IMemoryCacheмы можем добавлять новые значения в кеш или проверять и извлекать значения, которые уже существуют в кеше.

Основные методы:

  • TryGetValue — проверить, существует ли какое-либо значение для данного ключа.
  • Set — установить значение для данного ключа

Я добавлю интерфейс IMemoryCache в новый контроллер, который я назвал EmployeeController.

Ниже я предоставил код EmployeeController с комментариями.

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

Срок действия. Скользящее против абсолютного

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

Мы, как разработчики, можем установить срок действия объекта кеша — абсолютный или скользящий.

Абсолютный срок действия означает, что срок действия кеша истечет через заданное количество времени.

Например, мы установили 60 секунд, и ровно через 60 секунд этот объект истечет, независимо от количества обращений к нему.

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

Например, мы устанавливаем 60 секунд. Если в течение 60 секунд не было звонка, то он будет удален. Если объект был извлечен, то эти 60 секунд будут заново перезаписаны.

Можно ли использовать скользящее с абсолютными параметрами?

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

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

Пример:

Попробуйте представить, что получится в примере выше и когда будет очищен кеш, или просто отлаживать локально :)

Распределенный кэш

IDistributedCache — центральный интерфейс в реализациях распределенного кэша .NET Core.

Этот интерфейс предполагает, что базовые методы с любой реализацией распределенного кэша должны обеспечивать:

  • Get, GetAsync — получить элемент из кеша по ключу.
  • Set, SetAsync — добавить новый элемент в кеш по ключу
  • Refresh, RefreshAsync — обновляет элементы на основе их строкового ключа и сбрасывает время ожидания скользящего срока действия.
  • Remove, RemoveAsync — удалить товар из кассы по ключу.

На данный момент существует 4 реализации этого интерфейса:

  • Распределенный кэш SQL Server
  • Распределенный кэш Redis
  • Распределенный кэш NCache
  • Кэш распределенной памяти

Конечно, вы можете написать собственную реализацию IDistributedCache.

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

Тогда зачем нам распределенный кэш памяти?

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

И тогда мы можем заменить его на другую реальную реализацию (Redis, NCache, SQL Server Cache) только изменив конфигурацию в Startup.

Код

Чтобы продемонстрировать, как использовать распределенный кэш, я буду использовать то же решение, но добавлю AddDistributedMemoryCache() в Startup.cs вместо AddMemoryCache().

Код с поясняющими комментариями:

Ссылка на репозиторий — https://github.com/stasoz1/CacheExamples
Удачного кодинга 😁

Узнали что-то новое?

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

Больше контента на blog.devgenius.io.