Лучшее хранилище ключей-значений для моего сервиса 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

Другие вопросы по тегам