Кэширование в памяти и на стороне клиентаC#

Место общения программистов C#
Ответить
Anonymous
 Кэширование в памяти и на стороне клиента

Сообщение 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;
}

Я не уверен насчет вышеизложенного, поскольку данные не сохранялись в кэшированном объекте, но я выполнил некоторые настройки в файле 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»