32人参与 • 2025-11-26 • Redis
适用场景:所有键的过期时间相同或无过期设置,且无需条件判断。 方法: 将多个set命令合并为mset命令,但需要注意mset的局限性(无法设置过期时间,且所有键值对必须一次性设置)。
mset customer_star:staff_20220311161756037_cus_20240201183046858 1 customer_star:staff_20220311161756037_cus_20240201182841857 1 ...(其他键值对)
优点:网络开销最小,一次请求完成所有操作。
缺点:无法设置过期时间,且要求所有键在同一哈希槽(集群模式下需使用哈希标签{})。
适用场景:需高效批量执行命令且允许非原子性操作。
将命令写入文件后通过管道执行:
# 创建命令文件 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
优点:减少网络往返次数,适合大规模批量操作。
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()优点:代码灵活,支持扩展(如设置过期时间)
适用场景:需原子性执行所有命令。
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执行命令:
redis-cli -h <host> -p <port> -a <password> eval "$(cat script.lua)" 0
优点:保证原子性,适合对一致性要求高的场景。
适用场景:需保证命令按顺序执行,但非严格原子性(集群模式下需所有键在同一哈希槽)。
multi set customer_star:staff_20220311161756037_cus_20240201183046858 1 set customer_star:staff_20220311161756037_cus_20240201182841857 1 ... exec
优点:命令顺序执行,支持条件判断(如watch)
缺点:集群模式下需使用哈希标签确保键在同一节点
问题:若为集群环境,需确保所有键在同一哈希槽。 解决方案:
{}包裹相同部分,例如:
set customer_star:{staff_20220311161756037}_cus_20240201183046858 1所有键的哈希标签{staff_20220311161756037}将分配到同一槽
| 方法 | 原子性 | 网络开销 | 适用场景 | 集群兼容性 |
|---|---|---|---|---|
| mset | 是 | 最低 | 简单键值批量设置 | 需哈希标签 |
| pipeline | 否 | 低 | 高效非原子批量操作 | 需哈希标签或分片 |
| lua脚本 | 是 | 中 | 复杂逻辑或原子性要求高 | 需哈希标签 |
| 事务 | 否 | 中 | 顺序执行且需条件判断 | 需哈希标签 |
选择建议:若无原子性要求,优先使用pipeline;若需原子性且逻辑简单,使用lua脚本。
到此这篇关于redis批量操作的实现示例的文章就介绍到这了,更多相关redis批量操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论