如何在Redis中高效批量设置多个存在关联的键
Redis批量写入性能优化方案
原有方案性能瓶颈分析
原有写法每次循环都会重新创建redis-cli进程、建立TCP连接、执行单条命令后断开连接,总计需要完成13万次以上的连接创建销毁操作,绝大多数时间都消耗在进程调度、网络握手的额外开销上,有效命令执行占比极低。
优化方案
方案一:使用Redis管道(Pipeline)批量提交命令
管道模式可以一次性将所有写入命令批量发送到Redis服务端,全程仅需要建立1次TCP连接,大幅降低网络和进程创建的额外开销。
# 先把十六进制的总数量转成十进制 num_total_keys=$((0x1FFFF)) # 生成所有SET命令一次性通过管道传给redis-cli for ((i = 0; i <= num_total_keys; i++)); do echo "SET some_prefix:$i True" done | redis-cli --pipe > /dev/null
方案二:使用Lua脚本在服务端执行(性能最优)
Redis 2.6及以上版本支持EVAL执行Lua脚本,仅需要发送1次请求到服务端,所有循环写入逻辑直接在Redis进程内完成,几乎没有额外网络开销,性能远高于管道方案。
num_total_keys=$((0x1FFFF)) redis-cli EVAL "for i=0,tonumber(ARGV[1]) do redis.call('SET', 'some_prefix:'..i, 'True') end" 0 $num_total_keys > /dev/null
性能参考
- 原有循环方案:13万条数据预计耗时1~5分钟(取决于网络延迟)
- 管道方案:预计耗时2~10秒
- Lua脚本方案:预计耗时小于1秒
内容的提问来源于stack exchange,提问作者hermit.crab
相关产品推荐
相关产品推荐

