0%

redis的multi和pipeline的介绍与区别

介绍

multi是标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

1
2
3
4
const multi = this.app.redis.multi();
multi.zadd(onlineUserListKey, 0, userId);
multi.expire(onlineUserListKey, this.defaultExpire);
await multi.exec();

把多个redis操作放到一个队列里,multi是在服务端缓冲,全部请求到redis以后,等待exec()命令,再一起执行,具有原子性.

pipeline是客户端将执行的命令写入到缓冲中,最后由exec命令一次性发送给redis执行返回

pipeline是通过管道一个个的去执行命令,在redis的客户端做缓冲,减少了redis的连接与请求量,减轻了redis的压力,但是结果依然是按顺序一个个执行,并不具有原子性

1
2
3
4
5
6
const pipeline = this.app.redis.pipeline();
for (let id of ids) {
const key = redisKeys.string.ad(id);
pipeline.get(key);
}
const arr = await pipeline.exec();

总结

multi和pipeline都是将redis命令缓冲,再统一执行,但是则重点不同

  • multi是为了多个操作的原子性,pipeline是为了减少redis的连接和请求压力.
  • multi是服务端缓冲,pipeline是客户端缓冲
  • 请求次数的不一致,multi需要每个命令都发送一次给服务端,pipeline最后一次性发送给服务端,请求次数相对于multi减少
  • multi/exec可以保证原子性,而pipeline不保证原子性

所以当redis操作要求保证原子性时,使用multi/exec,其他时候应该使用pipeline去减轻redis的压力