nodejs 使用redis-node组件执行multi事务实现批量操作数据

发布于 2020-03-27  1.03k 次阅读


首先安装nodejs redis组件 npm install redis

redis multi在node-redis使用的数据格式是一个数组

//示例

client
  .multi([
    ["mget", "foo", "bar", redis.print],
    ["incr", "hello"],
  ])
  .exec(function(err, replies) {
    console.log(replies);
  });

如果遇到海量数据的话,由于redis是单线程,一条一条的执行操作肯定是吃不消的,这个时候可以将数组拆分成多份来执行即可
//拆分数组
function group(array, subGroupLength) {
    let index = 0;
    let newArray = [];
    while (index < array.length) {
        newArray.push(array.slice(index, index += subGroupLength));
    }
    return newArray;
}

let arr=[1,2,3,4,5]
let newArray=group(arr,5) //拆成5等份

//循环执行事务
for (let v of newArray) {
    redisClient
        .multi(v)
        .exec(function (err, replies) {
            console.log("MULTI ok");
        });
}

至于命令的话就要根据业务场景来选择了

后续===>

关于node redis 的用法 比如要用到zset的某些方法,但是这些方法在node-redis的api中没有,那怎么办呢,node-redis有个叫做send_command的方法就是用来执行命令来查询的

同样,参数也是一个数组,这里我以查询zset中所有元素为例

redisClient.send_command(`zremrangebyrank`, ['fieldName', 0, -1], function (e, d) {
  if(e) console.log('error'+e.message);
    return d;
});

由于node-redis的操作是异步执行的,如果想要同步的话用prmoise重新封装一次即可

async function getAllScore(fieldName) {
    return new Promise((resolve, reject) => {
        redisClient.send_command(`zremrangebyrank`, [fieldName, 0, -1], function (e, d) {
            if (e) reject(d);
            resolve(d);
        });
    });
}

其他比较简单的用法node-redis的官方api中基本是有提供,如果没有提供的话只能用以上方法了。

 


一个逐渐被时间遗忘掉的人