我使用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服务器的多个查询。
所以我可以得到一个帖子阵列。
这是从redis服务器处理多个查询的正确方法吗?
我听说还有另外一种方式,一种是pipeline
,另一种是lua
脚本?
对于我在现实世界项目中的案例,哪一个是最好的和合适的方式?
答案 0 :(得分:1)
是的,你所做的是正确的。 Multi
将批处理所有hgetall
命令并在一批中执行它们。这是从redis服务器获取数据的有效方法。 AFAIK,multi是客户端库确保将命令作为管道发送到服务器的方式。
由于您只是从服务器读取,因此您的代码是合适的。但是,如果必须混合读取和写入,使得写入命令取决于先前读取命令的输出 - 那么多方法将不起作用。在这种情况下,编写lua脚本将是唯一的选择。