node-redis icon indicating copy to clipboard operation
node-redis copied to clipboard

How auto-pipelining works?

Open MARCROCK22 opened this issue 1 year ago • 1 comments

Description

how can I check if something is being executed as a pipeline? I know that docs says this code is automatically handled as a pipeline because they are in the same "tick":

await Promise.all([
   client.set(...),
   client.set(...),
   client.set(...),
])

but

const promises: Promise<unknown>[] = [];

for (const [key, value] of data) {
    promises.push(client.hSet(key, value));
    promises.push(client.expire(key, ...));
}

await Promise.all(promises);

is this being executed as a pipeline?

MARCROCK22 avatar Sep 18 '24 01:09 MARCROCK22

Yes, both of them are pipelined as both of them are running all the commands on the same "event loop tick"

edit: you can also use

const multi = client.mulit();
for (let i = 0; i < 10; i++) {
  multi.get(i.toString());
}
const results = await multi.execAsPipeline();

In case you are executing the commands once - an array of promises + Promies.all (or similar) is the most performant way as you don't create unnecessary objects/memory. If you are executing the same commands multiple times multi would perform better as the commands will be encoded once and reused for every executing.

leibale avatar Sep 19 '24 07:09 leibale

Thanks a lot.

MARCROCK22 avatar Jan 21 '25 00:01 MARCROCK22