Key-Value Store
Key-Value Store (хранилище типа «ключ-значение») — это тип нереляционной (NoSQL) системы управления базами данных (СУБД), в которой данные хранятся и извлекаются в виде пар «ключ — значение». В такой модели каждый элемент данных имеет уникальный идентификатор (ключ), по которому можно получить доступ к ассоциированному с ним значению. Значение может быть любого типа: строка, число, JSON-объект, бинарный файл (BLOB) или другой структурированный набор данных.
Принцип работы
В основе Key-Value Store лежит простая ассоциативная модель, напоминающая хеш-таблицу. Операции с данными сводятся к трём базовым действиям: Put (запись пары ключ-значение), Get (чтение значения по ключу) и Delete (удаление пары по ключу). В отличие от реляционных баз данных (например, PostgreSQL), здесь отсутствуют схемы, таблицы, связи между записями и язык структурированных запросов (SQL). Поиск возможен только по ключу; фильтрация по содержимому значения или сложные запросы с объединением данных не поддерживаются на уровне ядра системы.
Ключ обычно представляет собой строку или бинарный массив, реже — число. Значение хранится как непрозрачный блок данных, который интерпретируется только приложением. Это обеспечивает высокую скорость операций, так как не требуется разбор структуры значения на стороне СУБД.
История
Концепция Key-Value Store восходит к ранним компьютерным системам, где данные хранились в виде простых ассоциативных массивов. Одним из первых промышленных решений стала Berkeley DB (разработка Калифорнийского университета в Беркли, 1991 год), которая использовалась в операционных системах и встроенных приложениях.
Массовое распространение Key-Value Store получили в середине 2000-х годов с ростом веб-приложений и облачных сервисов. Крупные интернет-компании (Amazon, Google, Facebook) столкнулись с необходимостью обрабатывать огромные объёмы данных с низкой задержкой, что было трудно достижимо на классических реляционных СУБД. В 2007 году компания Amazon представила сервис Amazon DynamoDB (на основе внутренней разработки Dynamo), а в 2008 году — Apache Cassandra (изначально создана в Facebook для поиска в почтовом ящике). В 2009 году вышла Redis (разработчик — Сальваторе Санфилиппо), которая стала одной из самых популярных in-memory Key-Value СУБД.
Классификация
Key-Value Store можно разделить по нескольким признакам.
По способу хранения
- In-memory (в оперативной памяти): данные полностью или преимущественно хранятся в RAM. Обеспечивают минимальное время отклика (микросекунды), но требуют механизмов сохранения на диск для предотвращения потери данных. Примеры: Redis, Memcached.
- Persistent (на диске): данные записываются на постоянный носитель (SSD/HDD). Скорость ниже, чем у in-memory, но объём хранимых данных может быть значительно больше. Примеры: LevelDB (Google), RocksDB (Facebook), Berkeley DB.
- Гибридные: часть данных (наиболее часто запрашиваемая) держится в памяти, остальное — на диске. Пример: WiredTiger (используется в MongoDB).
По архитектуре
- Централизованные (standalone): работают на одном сервере. Просты в развёртывании, но имеют ограничения по масштабированию и отказоустойчивости. Пример: Redis (в базовой конфигурации).
- Распределённые (distributed): данные распределены по нескольким узлам (кластеру). Обеспечивают горизонтальное масштабирование и высокую доступность. Примеры: Amazon DynamoDB, Apache Cassandra, Riak KV.
- Встраиваемые (embedded): библиотека, которая интегрируется непосредственно в приложение, не требуя отдельного серверного процесса. Примеры: LevelDB, RocksDB, LMDB.
По модели согласованности
- Strong consistency (строгая согласованность): после записи все последующие чтения гарантированно возвращают актуальные данные. Снижает производительность в распределённых системах. Пример: etcd (использует алгоритм консенсуса Raft).
- Eventual consistency (согласованность в конечном счёте): при отсутствии новых изменений все узлы кластера со временем придут к одному состоянию. Обеспечивает высокую скорость записи. Пример: Apache Cassandra (по умолчанию).
- Read-your-writes (чтение собственных записей): клиент всегда видит результаты своих операций записи. Промежуточный вариант.
Применение
Key-Value Store востребованы в сценариях, где критичны скорость доступа и простота модели данных.
Кеширование
Наиболее распространённое применение. In-memory Key-Value Store (Memcached, Redis) используются для хранения результатов частых запросов к базе данных, сессий пользователей, HTML-фрагментов, данных API. Это позволяет разгрузить основную базу и ускорить работу веб-приложений.
Управление сессиями
В веб-приложениях данные сессии (например, корзина, аутентификационные токены) хранятся в Key-Value Store. Ключом служит идентификатор сессии (cookie), значением — сериализованный объект сессии.
Конфигурация и feature flags
Хранение настроек приложений, параметров конфигурации, флагов включения/отключения функций. Пример: etcd используется в Kubernetes для хранения конфигурации кластера.
Очереди сообщений
Некоторые Key-Value Store (Redis) поддерживают структуры данных, позволяющие реализовать простые очереди (list) и pub/sub-механизмы.
Игровая индустрия
Хранение состояния игрового мира, инвентаря персонажей, лидеров. Высокая скорость записи и чтения позволяет обрабатывать миллионы одновременных игроков.
Интернет вещей (IoT)
Сбор телеметрии с датчиков. Каждый датчик имеет уникальный ключ, значение — последнее показание или временной ряд.
Примеры реализаций
- Redis (Remote Dictionary Server) — in-memory Key-Value Store с поддержкой сложных типов данных (строки, списки, множества, хеши, геопространственные индексы). Работает на одном узле, поддерживает репликацию master-slave и кластеризацию. Используется для кеширования, очередей, сессий.
- Memcached — высокопроизводительная in-memory система, ориентированная на кеширование. Поддерживает только простые пары ключ-значение. Не имеет встроенной персистентности.
- Amazon DynamoDB — полностью управляемый облачный сервис от Amazon Web Services. Распределённая система с автоматическим масштабированием. Поддерживает строгую согласованность (опционально) и встроенные индексы.
- Apache Cassandra — распределённая децентрализованная СУБД с eventual consistency. Оптимизирована для записи. Используется в системах с огромными объёмами данных (например, в Netflix, Instagram).
- LevelDB — встраиваемая библиотека от Google. Хранит данные на диске в виде LSM-дерева. Используется в браузере Google Chrome (для хранения cookies и сессий) и в блокчейн-платформах.
- RocksDB — форк LevelDB от Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ). Оптимизирован для работы на многоядерных процессорах и SSD. Используется в Apache Flink, MySQL (как подключаемый движок MyRocks).
Преимущества и недостатки
Преимущества
- Высокая скорость: операции чтения и записи выполняются за O(1) или O(log N) в среднем.
- Простота модели: отсутствие схемы упрощает разработку и миграции.
- Горизонтальное масштабирование: распределённые Key-Value Store легко масштабируются добавлением узлов.
- Низкая задержка: особенно у in-memory систем, что критично для реального времени.
Недостатки
- Ограниченная функциональность запросов: невозможность выполнять сложные выборки, JOIN-операции, агрегации без внешних инструментов.
- Отсутствие связей между данными: приложение само должно управлять ссылочной целостностью.
- Сложность обеспечения согласованности в распределённых системах (CAP-теорема).
- Потенциальные проблемы с дублированием данных: из-за отсутствия нормализации.
Критика
Основная критика Key-Value Store связана с их ограниченной выразительностью. Для задач, требующих сложных аналитических запросов (отчётность, бизнес-аналитика), они непригодны. Кроме того, разработчики, привыкшие к реляционным базам, часто сталкиваются с необходимостью вручную управлять индексами и связями, что увеличивает сложность кода. В некоторых случаях (например, при использовании eventual consistency) возможны временные расхождения данных, что неприемлемо для финансовых систем.
Источники
- C. J. Date. An Introduction to Database Systems (8th ed.). Addison-Wesley, 2003.
- G. DeCandia et al. Dynamo: Amazon’s Highly Available Key-value Store. In Proceedings of SOSP, 2007.
- A. Lakshman, P. Malik. Cassandra: A Decentralized Structured Storage System. ACM SIGOPS Operating Systems Review, 2010.
- S. Sanfilippo. Redis Documentation. Redis Labs, 2009–2025.
- J. Dean, S. Ghemawat. LevelDB: A Fast and Lightweight Key-Value Store. Google, 2011.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →