Ответ
Кэширование — это стратегия хранения копии данных в быстродоступном хранилище (чаще всего в оперативной памяти) для ускорения последующих запросов к этим данным и снижения нагрузки на первичный, более медленный источник (БД, внешний API, диск).
Основные цели:
- Уменьшение задержки (Latency): Доступ к RAM (наносекунды) в сотни раз быстрее, чем к диску или сетевому ресурсу (миллисекунды).
- Снижение нагрузки на источник данных: Кэш принимает на себя повторяющиеся запросы, предотвращая перегрузку базы данных или внешних сервисов.
- Повышение пропускной способности (Throughput): Система может обрабатывать больше запросов в единицу времени.
Пример реализации в C# с IMemoryCache:
public class UserService
{
private readonly IMemoryCache _cache;
private readonly AppDbContext _dbContext;
public async Task<User> GetUserAsync(int userId)
{
// Формируем ключ для кэша.
var cacheKey = $"user_{userId}";
// Пытаемся получить данные из кэша.
if (!_cache.TryGetValue(cacheKey, out User user))
{
// Данных в кэше нет — идем в БД.
user = await _dbContext.Users.FindAsync(userId);
if (user != null)
{
// Сохраняем в кэш на 5 минут.
_cache.Set(cacheKey, user, TimeSpan.FromMinutes(5));
}
}
return user;
}
}
Критерии использования кэша:
- Данные читаются часто, но изменяются редко.
- Допустимо некоторое отставание данных (неконсистентность) в течение срока жизни кэша.
- Получение данных из первичного источника — ресурсоемкая операция.
Важные аспекты:
- Стратегия инвалидации: TTL (Time-To-Live), инвалидация по событию изменения данных.
- Политика вытеснения: LRU (Least Recently Used) при заполнении кэша.
- Распределенные кэши: Для многопоточных/распределенных систем (Redis, NCache).