我使用node_redis,并在redis中存储了一些散列数据,如下所示:
127.0.0.1:6379> keys *
1) "posts:list"
2) "posts:page.view"
3) "slug.to.id"
4) "posts:count"
5) "post:1002"
6) "post:1001"
7) "post:3"
8) "post:2"
9) "post:1000"
127.0.0.1:6379> type post:2
hash我想通过id获取这些帖子,所以我编写了一个函数,如下所示:
function getPostsByPage(page = 1, pageSize = 10) {
const start = (page - 1) * pageSize;
const end = page * pageSize - 1;
return client.lrangeAsync('posts:list', start, end).then(postIds => {
const multi = client.multi();
postIds.forEach(postId => {
multi.hgetall(`post:${postId}`);
});
return multi.execAsync();
});
}现在,我使用redis.multi()方法来处理来自redis服务器的多个查询。
这样我就可以得到一个post数组。
这是处理来自redis服务器的多个查询的正确方式吗?
我听说还有另外一种方式,一种是pipeline,另一种是lua script?
在现实世界的项目中,哪种方法最适合我的情况?
发布于 2018-03-28 19:03:13
是的,你正在做的事情是正确的。Multi将对所有hgetall命令进行批处理,并在一批中执行它们。这是从redis服务器获取数据的一种有效方法。AFAIK,multi是客户端库确保命令作为管道发送到服务器的方式。
由于您仅从服务器读取数据,因此您的代码是适当的。但是,如果您必须混合读取和写入,以便您的写入命令依赖于前一个读取命令的输出,那么多方法将不起作用。在这种情况下,编写lua脚本将是唯一的选择。
https://stackoverflow.com/questions/49528120
复制相似问题