Кэширование состояния сеанса.NET с помощью Redis, MongoDB, ServiceStack
Я провел некоторое исследование о том, нормально ли это для кэширования.NET Session State во внешних БД, таких как Redis, MongoDb или других высоко масштабируемых инструментах.
Результатом моего исследования было то, что, хотя MongoDB обладает большей интеграцией для такого рода вещей, кажется, что Redis гораздо более производительный и имеет гораздо больше опций (срок действия ключа, наборы и т. Д.) Для использования.
Существует еще одна инфраструктура под названием ServiceStack, в которой реализована реализация RedisClient, но, по-моему, способ ее реализации гораздо более взаимосвязан, чем хотелось бы.
public override object OnGet(CachedOrders request)
{
var cacheKey = "some_unique_key_for_order";
return base.RequestContext.ToOptimizedResultUsingCache(this.CacheClient, cacheKey, () =>
{
//This delegate will be executed if the cache doesn't have an item
//with the provided key
//Return here your response DTO
//It will be cached automatically
});
}
Поэтому после этого исследования я хотел бы узнать ваше мнение и о том, внедрили ли вы этот вид кэширования в любое из ваших приложений. Можете ли вы поделиться своим опытом?
Спасибо!
2 ответа
Кэширование ServiceStack не связано, ToOptimizedResultUsingCache()
Метод - это просто удобство. Метод расширения, позволяющий реализовать общий шаблон кэширования в минимально необходимом шаблоне. ToOptimizedResult
метод возвращает наиболее оптимизированный результат, основанный на MimeType и CompressionType из IRequestContext. например, в службе JSON это обычно будет вывод deflate DTO JSON Response.
Вам не нужно использовать метод расширения, и вы можете напрямую обращаться к API ICacheClient, так как это свойство с автоматическим подключением в ServiceBase
учебный класс. Если вам требуется больше функциональности, чем может обеспечить API ICacheClient, я рекомендую использовать RedisClient от Redis и ServiceStack, который предоставляет вам быстрый атомарный доступ к распределенным коллекциям compisci.
Преимущество использования ICacheClient
API заключается в том, что это тестируемый независимый от реализации интерфейс кэширования, который в настоящее время имеет поставщиков InMemory, Redis и Memcached.
Я написал пакет NuGet для этого 2 года назад, и с тех пор мы используем его в производстве. Это переопределяет.NET SessionStateProvider
с пользовательским классом, который позволяет сохранение в Redis, с различными функциями, такими как:
- Пишите только в Redis при изменении значений
- Параллельный доступ к сеансу из нескольких запросов с одним и тем же идентификатором сеанса
- Возможность доступа к сеансу из Web API (хотя это нарушает принципы REST, если вам это нужно)
- Простая настройка формата сериализации (сверните свой собственный или измените структуру Json)
Вы можете получить его здесь: https://www.nuget.org/packages/RedisSessionProvider