node-redis,如何获取哈希对象列表?

时间:2018-03-28 07:04:52

标签: redis node-redis

我使用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脚本?

对于我在现实世界项目中的案例,哪一个是最好的和合适的方式?

1 个答案:

答案 0 :(得分:1)

是的,你所做的是正确的。 Multi将批处理所有hgetall命令并在一批中执行它们。这是从redis服务器获取数据的有效方法。 AFAIK,multi是客户端库确保将命令作为管道发送到服务器的方式。

由于您只是从服务器读取,因此您的代码是合适的。但是,如果必须混合读取和写入,使得写入命令取决于先前读取命令的输出 - 那么多方法将不起作用。在这种情况下,编写lua脚本将是唯一的选择。