Node.js + множественный поиск Redis

Я новичок в магазинах ключевых ценностей, но я хотел бы научиться. В качестве личного проекта я пытаюсь создать систему управления запасами с помощью Node.js и Redis. Давайте предположим, что это правильная технология для использования на данный момент.

Если бы у меня была простая система, которая должна отслеживать количество виджетов в определенном месте, с возможностью поиска деталей по виджету или по местоположению, мое понимание согласно https://matt.sh/Thinking-in-redis-part-one предназначен для хранения отдельных "настраиваемых индексов" для поиска по местоположению. и по пункту.

В node.js, чтобы сохранить новую запись, мы создадим запись с помощью hmset, добавим запись в 2 индекса с помощью sadd:

redis.hmset([
    key,
    'attr1', entry.attr1,
    'attr2', entry.attr2,
    'attr3', entry.attr3,
  ],
  function(err) {        
    // add entry to location set
    var locationKey = 'location:' + entry.location;
    redis.sadd(locationKey, key, function(err) {
      redis.expire(locationKey, 900);
    });

    // add entry to widget set
    var widgetKey = 'widget:' + widget.id;
    redis.sadd(widgetKey, key, function(err) {
      redis.expire(widgetKey, 900);
    });

    redis.expire(key, 900);
  }
);

Теперь, если мы хотим переместить все виджеты из одного места в другое, нам нужно будет получить все записи из набора виджетов, добавить запись в индекс нового местоположения и удалить ее из старого индекса:

// move all widgets to another location
redis.smembers('widget:' + widget.id, function(err, entryKeys) {
  entryKeys.forEach(function(entryKey) {
    // get entry for rebroadcast
    redis.hgetall(entryKey, function(err, result) {
      if (result) {
        // add entry to new location's index
        var locationKey = 'location:' + location;
        redis.sadd(locationKey, entryKey, function(err) {
          redis.expire(locationKey, 900);
        });
        // remove entry from old location's index
        redis.srem('location:' + result.location, entryKey);
      }
    });
  });
});

Меня беспокоит количество запросов, которые необходимо сделать для каждой команды. Добавление записи будет стоить 3 вставки для самих данных и еще 3, если мы хотим истечь срок действия данных. Для перемещения всех виджетов потребуется 1+n вставок, n чтений и n удалений.

Если бы это была игра в реальном времени с сотнями или тысячами запросов в секунду, нормально ли, чтобы каждая команда требовала столько вызовов? Это нормально для реализации Redis?


person Adam    schedule 20.10.2014    source источник


Ответы (1)


Да.

Redis такой быстрый. Но сделайте тест на своей машине или аналогичной рабочей машине, на которой будет работать Redis. Он включен в сам Redis.. (Выложи сюда, мне тоже интересно)

В Redis есть множество команд, и ваша организация данных может разрешить более дешевые звонки или звонить реже. . Это будет зависеть от того, как вы разместите модель данных. На самом деле не существует «языка запросов», такого как SQL, который может делать много вещей в запросе или объединять запросы в один. Вы должны много использовать Redis, что отличается от философии SQL (в некоторой степени).

Этот личный проект позволит вам увидеть, что работает, а что можно улучшить, так что спасибо за усилия. Удачи!

person clay    schedule 20.10.2014
comment
+1 к «Да» @clay :) Я предполагаю, что ваш начальный hmset включает атрибут location, но я не уверен, нужен ли hgetall в коде перемещения. В зависимости от количества атрибутов (размера структуры хеш-данных) получение всех полей может замедлить работу, поэтому, если вы ищете только новое местоположение ключа, используйте вместо этого hget key 'location'. - person Itamar Haber; 20.10.2014
comment
Кроме того, рассмотрите возможность использования сценариев Lua (см. команду EVAL) для реализации таких вещей, как рабочий процесс перемещения — это сохранит обмен данными между вашим приложением Node и Redis, поэтому производительность должна быть выше. - person Itamar Haber; 20.10.2014