Ответ
Сервис может хранить различные виды состояния, и выбор хранилища зависит от характера данных и требований к доступности.
| Вид состояния | Пример | Типичное решение |
|---|---|---|
| Сессионное | Корзина покупок, данные авторизованного пользователя. | Redis или Memcached (быстро, in-memory, с TTL). |
| Кэш | Результаты тяжелых запросов, статичные справочники. | Redis, Caffeine (in-memory cache для JVM). |
| Постоянное | Основные бизнес-сущности (пользователи, заказы). | Реляционная БД (PostgreSQL, MySQL) или NoSQL (MongoDB). |
| Файловое | Загруженные изображения, документы. | Объектное хранилище (S3, MinIO) или файловая система. |
Пример реализации кэширования в Spring:
@Service
public class ProductService {
@Cacheable(value = "products", key = "#id")
public Product getProduct(String id) {
// Дорогой запрос к БД выполнится только при промахе кэша
return productRepository.findById(id).orElseThrow();
}
@CacheEvict(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
// При обновлении запись инвалидируется из кэша
return productRepository.save(product);
}
}
Ключевой принцип: Старайтесь проектировать сервисы как stateless, вынося состояние во внешние, специализированные хранилища. Это упрощает масштабирование и отказоустойчивость.