直接回答
Pipeline(管道) 是把多条命令一次性打包发给服务端、再一次性读回所有结果的机制,核心价值是省去每条命令的网络往返时间(RTT)——10 条命令从 10 次 RTT 变成 1 次,批量操作吞吐量大幅提升。它与事务的区别:pipeline 只是批量发送,不保证原子性;事务(MULTI/EXEC)保证命令原子执行、中间不插入其他客户端命令。
展开解析
要点对比:
- 目的不同:pipeline 是客户端-服务端的通信优化;事务是执行语义保证。
- 原子性:pipeline 中某条命令失败不影响其他命令,已执行的也不会回滚;MULTI/EXEC 期间命令入队、EXEC 时顺序执行,不会被其他客户端插入(但注意 Redis 事务同样不支持回滚,语法错误的命令之外其余照常执行)。
- 可以叠加:pipeline 里可以包 MULTI/EXEC,一次往返发送一个原子事务。
使用注意:pipeline 打包的命令在服务端会缓冲结果,一次别发太多(比如几万条),否则占用服务端输出缓冲内存,应分批(如每批几百条);pipeline 期间这些命令并非独占执行,其他客户端命令可能穿插其中。
pipe = redis.pipeline()
for uid in uids:
pipe.hgetall(f"user:{uid}") # 仅入队,未发请求
results = pipe.execute() # 一次往返全部取回
追问方向:与 Lua 脚本的选择(要原子性/服务端逻辑用 Lua,纯批量用 pipeline)。