redis-benchmark -n 100000 -P 100 -t get
INFO commandstats
SLOWLOG GET 5

批量任务报 SocketTimeoutException: Read timed out,服务端留下一条 900 毫秒的请求。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,pipeline 只是把命令攒起来一次性发出,服务端仍然逐条执行再一次性回包,条数太多时长时间占住主线程,回包体积还会撑爆客户端缓冲区。

「Redis pipeline 分批」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

处理上按这个顺序:每批五百到一千条地切分 每批之间让出事件循环;每批单独设超时 失败了只重跑这一小批数据;集群模式下还要保证同一批的键落在同一个槽里。

改完只确认一件事:单批耗时稳定在 50 毫秒内,整个批处理任务的总时间反而更短。

作者 9823189