一、原生批量命令(MSET)
适用场景 :所有键的过期时间相同或无过期设置,且无需条件判断。 方法 : 将多个SET命令合并为MSET
命令,但需要注意MSET的局限性(无法设置过期时间,且所有键值对必须一次性设置)。
bash
MSET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858 1 CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857 1 ...(其他键值对)
优点:网络开销最小,一次请求完成所有操作。
缺点 :无法设置过期时间,且要求所有键在同一哈希槽(集群模式下需使用哈希标签{}
)。
二、Pipeline(管道)
适用场景:需高效批量执行命令且允许非原子性操作。
1. 命令行操作
将命令写入文件后通过管道执行:
bash
# 创建命令文件 commands.txt
echo "SET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858 1" >> commands.txt
# 追加其他命令...
# 通过redis-cli执行
cat commands.txt | redis-cli -h <host> -p <port> -a <password> --pipe
优点:减少网络往返次数,适合大规模批量操作。
2. 编程语言实现(以Python为例)
python
import redis
r = redis.Redis(host='localhost', port=6379)
pipe = r.pipeline()
keys = [
"CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858",
"CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857",
# ...其他键
]
for key in keys:
pipe.set(key, 1)
pipe.execute()
优点:代码灵活,支持扩展(如设置过期时间)
三、Lua脚本
适用场景:需原子性执行所有命令。
Lua
local keys = {
'CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858',
'CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857',
-- 其他键
}
for _, key in ipairs(keys) do
redis.call('SET', key, 1)
end
执行命令:
bash
redis-cli -h <host> -p <port> -a <password> EVAL "$(cat script.lua)" 0
优点:保证原子性,适合对一致性要求高的场景。
四、Redis事务(MULTI/EXEC)
适用场景:需保证命令按顺序执行,但非严格原子性(集群模式下需所有键在同一哈希槽)。
bash
MULTI
SET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858 1
SET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857 1
...
EXEC
优点:命令顺序执行,支持条件判断(如WATCH)
缺点:集群模式下需使用哈希标签确保键在同一节点
五、Redis集群模式优化
问题 :若为集群环境,需确保所有键在同一哈希槽。 解决方案:
-
使用哈希标签 :在键名中使用
{}
包裹相同部分,例如:bashSET CUSTOMER_STAR:{STAFF_20220311161756037}_CUS_20240201183046858 1
所有键的哈希标签
{STAFF_20220311161756037}
将分配到同一槽 -
分节点执行:若无法使用哈希标签,需将命令按哈希槽分组后分别发送到对应节点。
六、性能优化建议
- 控制批量大小:单次Pipeline建议不超过500条命令,避免内存或网络阻塞 。
- 错误处理:Pipeline和Lua脚本需捕获并处理部分失败的情况 。
- 网络优化:优先使用内网连接,减少延迟 。
七、执行方式对比
方法 | 原子性 | 网络开销 | 适用场景 | 集群兼容性 |
---|---|---|---|---|
MSET | 是 | 最低 | 简单键值批量设置 | 需哈希标签 |
Pipeline | 否 | 低 | 高效非原子批量操作 | 需哈希标签或分片 |
Lua脚本 | 是 | 中 | 复杂逻辑或原子性要求高 | 需哈希标签 |
事务 | 否 | 中 | 顺序执行且需条件判断 | 需哈希标签 |
选择建议:若无原子性要求,优先使用Pipeline ;若需原子性且逻辑简单,使用Lua脚本。