2012-12-27 74 views
3

我用连接,Redis的我的会话存储,当我使用req.session,似乎所有的操作上是同步,它像普通的Javascript变量操作,代码服从命令。但我检查了source code,它使用了不同步的方式,所以我想知道为什么req.session就是这样。nodejs-redis(&connect-redis)如何处理同步和异步?

的另一个问题是,如果我有多个Redis的查询,

client.sadd('test', 1); 
client.del('test'); 
client.sadd('test', 2); 
client.sadd('test', 3); 

无论身在何处,我把德尔操作,结果总是相同的。我认为这些查询可能以任何顺序运行?因为它们都是异步调用的,所以我预期的结果应该每次都有所不同。

感谢您帮助

+0

你是什么意思'结果总是正确的'。如果它是正确的,那么问题是什么? – soulcheck

+0

抱歉,我不清楚,因为我认为它们是以随机顺序运行的,因为它们是异步的,所以结果可能每次都不一样,但结果每次都是一样的,它们是正确的 – Chun

回答

2

是往返操作Redis的服务器进行异步管理并不意味着查询将按照随机顺序发送的事实。

Redis(因此大多数Redis客户端库)支持pipelining,通常用于优化往返次数。这个想法是发送多个查询,然后等待答复。订单是至关重要的,因为它被客户用来匹配查询和回复。

Node.js非常适合支持这种机制。 Matt Ranney的node_redis客户端支持以透明的方式进行流水线操作。如果使用相同的客户端对象,则所有查询都将被序列化并按顺序执行。

在你的例子中,查询总是以相同的顺序执行是正常的。您可以通过使用monitor命令来显示发送到Redis的查询流程来检查此点。

现在,重要的是管道的最后一个查询与回调关联,否则您的程序将永远不知道最后一个查询何时完成。