介绍
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的压力