Здравствуйте, давайте поговорим о кеше, какие типы кеша существуют и как мы можем их использовать в .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.