2011-02-11 1 views
8

Я играл с Node.js и Redis и установили библиотеку hiredis с помощью этой командыNode.js (Привет) Redis и нескольких команд

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 

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

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

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.

ответ

13

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

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

+2

не могли бы вы объяснить это на примере? –

+0

То же пояснение. В документации говорится, что она истощает очередь. Учитывая, что вы можете повторно запустить exec и повторить его, это очень запутанно. – maletor