批量灌数据时,最容易被忽略的是网络往返。每条命令都「发一个包、等一个回包」,哪怕 Redis 处理只要微秒级,RTT 也会把吞吐压到几千 QPS。
# 1) 逐条:N 次 RTT
for kv in items: r.set(kv.k, kv.v)
# 2) pipeline:攒一批一起发,RTT 从 N 次降到 N/批大小 次
pipe = r.pipeline()
for kv in items: pipe.set(kv.k, kv.v)
pipe.execute()
# 3) Lua:在服务端原子执行,适合「读-算-写」
r.eval("for i,k in ipairs(KEYS) do redis.call('SET', k, ARGV[i]) end", ...)
MULTI/EXEC 或 Lua。同样 10 万条小 KV:逐条约 8 秒,pipeline(每批 1000)约 0.7 秒,提升 10 倍以上,瓶颈从网络转到了 Redis 单线程本身。
— 本文为个人运维笔记,如有疏漏欢迎指正。