3

我的会话存储使用了connect-redis,当我使用时req.session,似乎所有的操作都是同步的,就像对普通的Javascript变量进行操作一样,代码服从顺序。但我检查了源代码,它使用异步方式,所以我想知道为什么会req.session这样。

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

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

不管我把del操作放在哪里,结果总是一样的。我认为这些查询可以按任何顺序运行,对吗?因为它们都是异步调用的,所以我预期的结果每次都应该不同。

谢谢你的帮助

4

1 回答 1

2

异步管理到 Redis 服务器的往返并不意味着查询将以随机顺序发送。

Redis(以及因此大多数 Redis 客户端库)支持流水线,通常用于优化往返次数。这个想法是发送多个查询,然后等待回复。顺序很关键,因为客户端使用它来匹配查询和回复。

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

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

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

于 2012-12-27T19:20:45.783 回答