使用Node.js redis的.promisify与.multi或.batch结合使用

3

使用npm模块'redis'时,对于单个命令,我使用了utils promisify而没有遇到任何问题。

const { promisify } = require("util");
const redis = require("redis");
const client = redis.createClient();

const hmgetAsync = promisify(client.hmget).bind(client),

现在我想要能够使用.multi和.batch方法。

这是一个使用.batch的辅助函数示例,没有使用promisify或非promisify版本的命令。

const getData = async (ids) => {
    const batch = client.batch();

    ids.forEach(id => {
        batch.hgetall(id)
    });

    return new Promise((resolve, reject) => {
        batch.exec((err, replies) => {
            if (err) {
                reject(err);
            }

            const data = replies
                // missing keys require filtering
                .filter(it => !!it)
                .map(dataPoint => _toDataPoint(dataPoint));

            resolve(data);
        })
    })
};

代码可以正常工作,但是我想知道是否可以在 .multi 或者 .batch 中使用 promisify。

非常感谢。

2个回答

4
这是一个使用命令数组作为参数的带有 Promise 版本的 multi 的示例:
const { promisify } = require("util");
const redis = require("redis");
const client = redis.createClient();

const multiPromisified = commands => {
        const multi = client.multi(commands);
        return promisify(multi.exec).call(multi);
}

multiPromisified([['get', 'key1'], ['get', 'key2']]);

0
添加更清晰的方式来创建Redis批处理管道,并以数组格式获取响应。
  async execute(pipeline: any) {
    return await new Promise((resolve, reject) => {
      pipeline.exec((err: any, results: any) => {
        if (err) { reject([]); }
        if (results === null) { resolve([]); }
        else { resolve(results); }
      });
    });
  };

const client = redis.createClient(options);
const batch = client.batch();
batch.get('data1').get('data2').get('data3');
const responses = await execute(client);

编辑:
我在Redis批处理管道中遇到了一些操作数量的问题。在这里分享我的发现。
batch.queue.length // this field has number of operations in pipeline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接