NoSQL #
1. NoSQL типы БД #
Тип | Пример | Особенности | Когда использовать |
---|---|---|---|
Документные | MongoDB | JSON-документы, гибкая структура | Динамические, неструктурированные данные |
Ключ-значение | Redis, DynamoDB | Максимально быстрый доступ | Кэш, данные с уникальными ключами |
Колонко-ориентированные | Cassandra | Хранение по колонкам | Аналитика, обработка больших данных |
Графовые | Neo4j | Узлы и связи | Моделирование сложных связей между данными |
2. Для чего используется Redis? #
Redis — это высокопроизводительная NoSQL база данных, которая работает в оперативной памяти (in-memory), обеспечивая минимальные задержки. Основное назначение Redis — хранение данных в виде ключ-значение.
3. Что такое Кэш? #
Кэш — это временное хранилище данных, созданное для ускорения повторного доступа к ним.
Преимущества:
- Ускорение: Данные быстрее извлекаются из кэша, чем из основного хранилища.
- Экономия ресурсов: Уменьшение нагрузки на сервер базы данных.
- Снижение задержек: Быстрый доступ к часто используемым данным.
Пример:
- Кэширование результата SQL-запроса:
- Пользователь делает запрос к базе данных.
- Результат сохраняется в Redis.
- Повторный запрос возвращает данные из кэша Redis.
Подходы к настройке инвалидации кэша
Инвалидация кэша необходима для обеспечения актуальности данных в кэше. Существует несколько основных подходов:
- Time-to-Live (TTL)
Описание: Устанавливается время жизни данных в кэше. После истечения этого времени данные удаляются автоматически.
Преимущества: Простота настройки, минимальная нагрузка на систему.
Недостатки: Возможна работа с устаревшими данными до истечения TTL.
Пример:
redis.set(key, value, 60); // Удаление через 60 секунд
- Manual Invalidation
Описание: Инвалидация данных выполняется вручную, например, при обновлении данных в основной базе данных.
Преимущества: Полный контроль над процессом.
Недостатки: Возможен человеческий фактор — забыть удалить данные из кэша.
Пример: Удаление ключа после изменения записи в базе.
redis.del("user:123");
- Write-Through
Описание: Данные сначала записываются в кэш, а затем в основное хранилище.
Преимущества: Актуальность данных в кэше всегда гарантирована.
Недостатки: Запись медленнее из-за двойной операции (кэш + база).
Пример: Обновление данных пользователя.
redis.set("user:123", updatedData); database.update(user);
- Read-Through
Описание: Если данных нет в кэше, они автоматически загружаются из базы данных и сохраняются в кэш.
Преимущества: Удобство и минимизация кэш-промахов.
Недостатки: Первая загрузка данных занимает больше времени.
Пример: Ленивое заполнение кэша.
String value = redis.get(key); if (value == null) { value = database.query(key); redis.set(key, value); }
- Cache-Aside
Описание: Приложение сначала проверяет кэш. Если данных нет, оно загружает их из базы, обновляет кэш и возвращает данные.
Преимущества: Гибкий и широко используемый подход.
Недостатки: Требуется ручное управление данными в кэше и их синхронизация.
Пример:
String value = redis.get(key); if (value == null) { value = database.query(key); redis.set(key, value); }
- Event-Driven Invalidation
Описание: Кэш автоматически обновляется при изменении данных в основной базе с помощью событий (например, через очередь сообщений).
Преимущества: Данные в кэше всегда актуальны.
Недостатки: Сложность реализации, необходимость обработки событий.
Пример: Отправка события при обновлении базы.
eventBus.publish("userUpdated", userId);
Локальный vs распределенный кэш
Критерий | Локальный кэш | Распределенный кэш |
---|---|---|
Расположение | В памяти одного узла (сервер/процесс). | Общий для нескольких узлов. |
Пример реализации | ConcurrentHashMap , Guava Cache. | Redis, Memcached. |
Производительность | Высокая (минимальная задержка). | Зависит от сети и задержек доступа. |
Масштабируемость | Ограничена памятью одного узла. | Масштабируется для распределенных систем. |
Доступность | Только для локального узла. | Доступен для всех участников системы. |
Сложность | Прост в реализации. | Требует настройки и управления сетью. |
Инвалидация данных | Уникальна для каждого узла. | Единая для всех узлов. |
Применение | Подходит для одиночных серверов. | Идеален для микросервисов и кластеров. |