Node.js, (Привет) Redis и мульти команда - PullRequest
8 голосов
/ 11 февраля 2011

Я играю с node.js и redis и установил библиотеку hiredis с помощью этой команды

npm install hiredis redis

Я посмотрел несколько примеров здесь:

https://github.com/mranney/node_redis/blob/master/examples/multi2.js

В строке 17 написано

// you can re-run the same transaction if you like

, что означает, что внутренний объект multi.queue никогда не очищается после завершения выполнения команд.

Мой вопрос: как бы вы справились с ситуацией в среде http?Например, отслеживание последнего подключенного пользователя (на самом деле это не требует multi, поскольку он просто выполняет одну команду, но за ним легко следить)

var http = require('http');
redis = require('redis');

client = redis.createClient()
multi = client.multi();

http.createServer(function (request, response) {
  multi.set('lastconnected', request.ip); // won't work, just an example
  multi.exec(function(err, replies) {
      console.log(replies);
  });
});

В этом случае multi.exec выполнит 1 транзакцию дляпервый подключенный пользователь и 100 транзакций для 100-го пользователя (поскольку внутренний объект multi.queue никогда не очищается).

Вариант 1: Должен ли я создать мультиобъект внутри функции обратного вызова http.createServer, который эффективно убил бы его в конце выполнения функции?Насколько дорого с точки зрения циклов ЦП было бы создание и уничтожение этого объекта?

Вариант 2: Другим вариантом будет создание новой версии multi.exec (), что-то вроде multi.execAndClear (), которая очистит очередь в момент выполнения redis это куча команд.

Какой вариант вы бы выбрали?Я полагаю, вариант 1 лучше - мы убиваем один объект вместо того, чтобы собирать его части вишни - я просто хочу быть уверен, так как я новичок и в нодах, и в JavaScript.

1 Ответ

13 голосов
/ 01 марта 2011

Создание нескольких объектов в node_redis очень недорого. Как побочный эффект, я подумал, что было бы здорово позволить вам использовать их повторно, но это, очевидно, полезно только при некоторых обстоятельствах. Продолжайте создавать новый мультиобъект каждый раз, когда вам нужна новая транзакция.

Следует иметь в виду, что вы должны использовать multi только в том случае, если вам действительно нужно, чтобы все операции выполнялись атомарно на сервере Redis. Если вы просто хотите эффективно объединить ряд команд, чтобы сэкономить пропускную способность сети и уменьшить количество обратных вызовов, которыми вы должны управлять, просто отправляйте отдельные команды, одну за другой. node_redis автоматически «направит» эти запросы на сервер по порядку, а отдельные обратные вызовы команд, если таковые имеются, будут вызываться по порядку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...