Я пытаюсь проверить, как работает кэширование в памяти и на стороне клиента, используя .NET 7.0. Для кэширования в памяти я сохраняю результаты из базы данных в кешированном объекте, и когда срок действия объекта истекает, он снова извлекает данные из базы данных. Поэтому я сделал следующее:
[HttpGet]
[Route("/user/GetUsers")]
public async Task GetUserDetails()
{
myStopWatch.Start();
Task users = GetCachedResponse(CacheKey.users, () => _user.GetUsers());
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return await users;
}
private async Task GetCachedResponse(string cacheKey, Func func)
{
List users = new List();
try
{
users = _cacheProvider.GetFromCache(cacheKey);
if (users != null) return users;
users = await func();
_cacheProvider.SetCache(cacheKey, users, cacheEntryOptions);
}
catch (Exception ex)
{
ex.ToString();
}
return users;
}
Чтобы проверить кэширование клиента, я сделал следующее:
[HttpGet]
[Route("/user/GetAllUsers")]
[ResponseCache(CacheProfileName = "UserCacheForOneMin")]
public async Task GetAllUsers()
{
myStopWatch.Start();
Task users = _user.GetUsers();
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return await users;
}
Я не уверен насчет вышеизложенного, поскольку данные не сохранялись в кэшированном объекте, но я выполнил некоторые настройки в файле Startup.cs как следует для кэширования ответов/клиентов.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.CacheProfiles.Add("UserCacheForOneMin",
new CacheProfile()
{
Duration = 60,
Location = ResponseCacheLocation.Client
});
});
}
public void Configure(WebApplication app, IWebHostEnvironment env)
{
app.UseResponseCaching();
}
Наконец, когда я запускаю приложение, я вижу следующие различия:
[img]https:/ /i.sstatic.net/8Mn6btUT.jpg[/img]
Несмотря на то, что кэширование клиента загружает данные быстрее, я хотел бы знать, как оно на самом деле работает «под капотом» без отдельного хранилища или чего-то подобного. и правильно ли я поступаю?
Примечание. При работе в памяти, если в базу данных добавляется новая запись, объект кэша загружает только кэшированные данные до истечения срока действия. Позже, по истечении срока действия, он показывает данные с вновь добавленными. Но кэширование клиента/ответа каждый раз проверяет наличие данных в базе данных со временем ответа меньшим, чем при кэшировании в памяти. Изображение слева предназначено для кэширования клиента/ответа, правое — для кэширования в памяти.
Обновление 1: согласно комментарию Freakish – Правильное измерение с помощью класса StopWatch
.[HttpGet]
[Route("/user/GetAllUsers")]
[ResponseCache(CacheProfileName = "UserCacheForOneMin")]
public async Task GetAllUsers()
{
myStopWatch.Start();
var users = await _user.GetUsers();
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return users;
}
[HttpGet]
[Route("/user/GetUsers")]
public async Task GetUserDetails()
{
myStopWatch.Start();
var users = await GetCachedResponse(CacheKey.users, () => _user.GetUsers());
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return users;
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... de-caching
Кэширование в памяти и на стороне клиента ⇐ C#
Место общения программистов C#
1716836562
Anonymous
Я пытаюсь проверить, как работает кэширование в памяти и на стороне клиента, используя .NET 7.0. Для кэширования в памяти я сохраняю результаты из базы данных в кешированном объекте, и когда срок действия объекта истекает, он снова извлекает данные из базы данных. Поэтому я сделал следующее:
[HttpGet]
[Route("/user/GetUsers")]
public async Task GetUserDetails()
{
myStopWatch.Start();
Task users = GetCachedResponse(CacheKey.users, () => _user.GetUsers());
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return await users;
}
private async Task GetCachedResponse(string cacheKey, Func func)
{
List users = new List();
try
{
users = _cacheProvider.GetFromCache(cacheKey);
if (users != null) return users;
users = await func();
_cacheProvider.SetCache(cacheKey, users, cacheEntryOptions);
}
catch (Exception ex)
{
ex.ToString();
}
return users;
}
Чтобы проверить кэширование клиента, я сделал следующее:
[HttpGet]
[Route("/user/GetAllUsers")]
[ResponseCache(CacheProfileName = "UserCacheForOneMin")]
public async Task GetAllUsers()
{
myStopWatch.Start();
Task users = _user.GetUsers();
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return await users;
}
Я не уверен насчет вышеизложенного, поскольку данные не сохранялись в кэшированном объекте, но я выполнил некоторые настройки в файле [b]Startup.cs[/b] как следует для кэширования ответов/клиентов.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.CacheProfiles.Add("UserCacheForOneMin",
new CacheProfile()
{
Duration = 60,
Location = ResponseCacheLocation.Client
});
});
}
public void Configure(WebApplication app, IWebHostEnvironment env)
{
app.UseResponseCaching();
}
Наконец, когда я запускаю приложение, я вижу следующие различия:
[img]https:/ /i.sstatic.net/8Mn6btUT.jpg[/img]
Несмотря на то, что кэширование клиента загружает данные быстрее, я хотел бы знать, как оно на самом деле работает «под капотом» без отдельного хранилища или чего-то подобного. и правильно ли я поступаю?
[b]Примечание[/b]. При работе в памяти, если в базу данных добавляется новая запись, объект кэша загружает только кэшированные данные до истечения срока действия. Позже, по истечении срока действия, он показывает данные с вновь добавленными. Но кэширование клиента/ответа каждый раз проверяет наличие данных в базе данных со временем ответа меньшим, чем при кэшировании в памяти. Изображение слева предназначено для кэширования клиента/ответа, правое — для кэширования в памяти.
[b]Обновление 1[/b]: согласно комментарию Freakish – Правильное измерение с помощью класса [b]StopWatch[/b]
.[HttpGet]
[Route("/user/GetAllUsers")]
[ResponseCache(CacheProfileName = "UserCacheForOneMin")]
public async Task GetAllUsers()
{
myStopWatch.Start();
var users = await _user.GetUsers();
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return users;
}
[HttpGet]
[Route("/user/GetUsers")]
public async Task GetUserDetails()
{
myStopWatch.Start();
var users = await GetCachedResponse(CacheKey.users, () => _user.GetUsers());
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return users;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78538804/in-memory-client-side-caching[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия