Ответ
Я разрабатывал систему кэширования с инвалидацией по времени (TTL) и событию для обеспечения консистентности данных при высокой нагрузке.
Архитектура решения (двухуровневый кэш):
- Локальный кэш (Caffeine) – для сверхбыстрого доступа в пределах одного экземпляра приложения.
- Распределенный кэш (Redis) – выступает в роли централизованного хранилища и шины событий для синхронизации между всеми инстансами.
Процесс обновления данных и инвалидации кэша:
public void updateItem(Item item) {
// 1. Атомарное обновление в основной базе данных
itemRepository.save(item);
// 2. Немедленная инвалидация в локальном кэше текущего инстанса
localCache.invalidate(item.getId());
// 3. Публикация события в Redis для уведомления всех других инстансов
redisTemplate.convertAndSend("cache:invalidate", item.getId());
}
Все инстансы приложения подписаны на канал cache:invalidate и инвалидируют свой локальный кэш при получении события. TTL в Redis выступает как fallback-механизм на случай сбоев. В результате система сочетает высокую скорость локального кэша с консистентностью распределенной системы.