Ответ
В проекте использовалась комбинация из нескольких хранилищ, каждое для своей задачи (полиглотное хранение).
| Хранилище | Назначение | Обоснование |
|---|---|---|
| PostgreSQL | Основное реляционное хранилище для структурированных данных: пользователи, заказы, транзакции, каталог товаров. | Надежность, ACID-транзакции, сложные JOIN-запросы, поддержка JSONB для полуструктурированных данных. |
| Redis | Кеширование (результаты тяжелых запросов, топ-N товаров), хранение сессий, временных токенов, очередей задач. | Работа в памяти, высочайшая скорость (микросекунды), поддержка структур данных (хеши, списки, множества). |
| Amazon S3 | Хранение бинарных файлов: изображения товаров, аватары пользователей, документы. | Масштабируемость, низкая стоимость хранения, интеграция с CDN. |
Пример конфигурации Spring Boot для PostgreSQL и Redis:
application.yml:
spring:
datasource:
url: jdbc:postgresql://${DB_HOST:localhost}:5432/app_db
username: ${DB_USER}
password: ${DB_PASS}
hikari:
maximum-pool-size: 10
data:
redis:
host: ${REDIS_HOST:localhost}
port: 6379
timeout: 2000ms
Пример кеширования с Redis в Spring:
@Service
public class ProductService {
@Cacheable(value = "products", key = "#id", unless = "#result == null")
public Product getProductById(Long id) {
// Дорогой запрос к БД выполняется только при промахе кеша
return productRepository.findById(id).orElse(null);
}
@CacheEvict(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
// При обновлении инвалидируем запись в кеше
return productRepository.save(product);
}
}