Лучшее хранилище ключей-значений для моего сервиса node.js
Мне нужно написать сервис node.js с хранилищем ключей-значений в качестве бэкэнда. Мои данные выглядят так:
Item
Name: "Item 1"
Attributes
AttributeA: "ValueA"
AttributeB: "ValueB"
AttributeC: "ValueC"
Item
Name: "Item 2"
Attributes
AttributeA: "ValueC"
AttributeB: "ValueD"
Я спросил себя, какой сервер лучше подходит для моих требований. Мне нужен быстрый бэкэнд, который легко доступен из node.js и может обрабатывать большие объемы данных (1-2 миллиона элементов с 15-20 атрибутами). Важно то, что атрибуты могут отличаться от элемента к элементу, поэтому нет 20 фиксированных атрибутов. Мои последующие запросы будут выглядеть так:
- Получить все атрибуты для элемента 1
- Получить все значения атрибута A (из всех элементов)
- Получить все элементы, которые содержат attributeB
Или, может быть, лучше использовать NoSQL DB, например, couchDB? Буду признателен за некоторые советы.;)
Спасибо
Торбена
3 ответа
Хотя это, вероятно, будет зависеть от других параметров (таких как размер атрибутов, их тип, соотношение чтения / записи), я думаю, что база данных документов, такая как MongoDb (ou couchDb, даже если я не использую ее лично), будет хорошо подходит. Причина в том, что вы хотите делать запросы на основе "значения" атрибутов, что невозможно в базе данных, такой как Redis (без изменения предложенной вами схемы, и хотя Redis отлично подходит для многих случаев использования)).
С такими документами: {name: "Item 1", AttributeA: "ValueA", AttributeB "ValueB"...}, вы можете реализовать запросы, о которых вы упомянули:
db.docs.find ({name: "Item 2"}); (возможно, установив индекс по имени, если вы часто используете этот запрос) db.docs.distinct('attributeA'); db.docs.find({attributeB: {$exist: true}}});
и так далее...
Вы можете найти очень хороший драйвер для nodejs mongodb здесь: https://github.com/christkv/node-mongodb-native
Надеюсь это поможет!
Я думаю, что mongoDB подойдет для вас. Это не совсем хранилище ключей / значений, а хранилище документов, которое немного отличается.
Вот что хорошо в монго с nodejs:
- Индекс-способные ключи.
- Составные индексы позволяют быстро запрашивать несколько атрибутов.
- Схема меньше. Вы можете добавлять / удалять атрибуты по своему усмотрению. Это было бы хорошо для вас, если у вас нет атрибутов для некоторых предметов.
- Быстро, все, что я когда-либо делал с этим, удивительно быстро.
- Сделано для тонны документов. Ваши миллионы предметов, правильно проиндексированных, только заставят mongodb смеяться над любыми сомнениями.
- Мощный. Такие вещи, как findAndModify и map/ lower дают вам удивительную гибкость. И в большинстве случаев они вам даже не нужны.
- Знакомый синтаксис JavaScript. this.db.items.findOne({attrA: 'value'}) просто чувствует себя хорошо.
Вот некоторые ограничения:
- Кажется, что все запустили драйвер node-js/mongodb. Самый полный, https://github.com/christkv/node-mongodb-native, имеет некоторые проблемы с юзабилити. Ваш код в конечном итоге выглядит очень управляемым обратным вызовом.
- 16 МБ ограничение на документ. Обычно это не проблема, но нужно быть осторожным.
- Sharding - это упражнение в проектировании / дизайне. Это не слишком сложно, но для этого нужно немного подумать. Я бы начал с одного сервера и расширил бы по мере необходимости.
- Вам нужен 64-битный сервер. Не обычно проблема в этот день, но кое-что, чтобы знать.
Как всегда, знайте свои инструменты. Я бы рекомендовал прочитать эту книгу: http://manning.com/banker/. Это очень хорошо написано.
Если вы хотите сделать это с помощью Redis, это немного сложно.
Для обработки поиска всех элементов, которые имеют определенный атрибут. Есть набор для каждого из атрибутов. Каждый раз, когда вы добавляете элемент, если у него есть атрибут, добавляйте его в набор. Если вы хотите получить все элементы с атрибутом, просто запросите весь набор, а затем получите все элементы на основе этого.
Добавляя что-то
HMSET item1 attributeA value attributeB value
SADD set_attributeA item1
SADD set_attributeB item1
Для ваших дел
1.
HGETALL item1
2.
SMEMBERS set_attributeA
затем просто повторить и получить все значения
HGET item1 attributeA
3.
use HGETALL instead of HGET
Для библиотеки узлов используйте https://github.com/mranney/node_redis нее есть несколько приятных дополнительных вещей, таких как создание объектов из результатов HGETALL, а также хранение объектов в хешах с помощью hmset