Какие хранилища данных использовались в вашем последнем проекте и для каких целей?

«Какие хранилища данных использовались в вашем последнем проекте и для каких целей?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В проекте использовалась комбинация из нескольких хранилищ, каждое для своей задачи (полиглотное хранение).

Хранилище Назначение Обоснование
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);
    }
}