Redis批量操作详解

一、原生批量命令(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集群模式优化

问题 :若为集群环境,需确保所有键在同一哈希槽。 解决方案

  1. 使用哈希标签 :在键名中使用{}包裹相同部分,例如:

    bash 复制代码
    SET CUSTOMER_STAR:{STAFF_20220311161756037}_CUS_20240201183046858 1

    所有键的哈希标签{STAFF_20220311161756037}将分配到同一槽

  2. 分节点执行:若无法使用哈希标签,需将命令按哈希槽分组后分别发送到对应节点。

六、性能优化建议

  1. 控制批量大小:单次Pipeline建议不超过500条命令,避免内存或网络阻塞 。
  2. 错误处理:Pipeline和Lua脚本需捕获并处理部分失败的情况 。
  3. 网络优化:优先使用内网连接,减少延迟 。

七、执行方式对比

方法 原子性 网络开销 适用场景 集群兼容性
MSET 最低 简单键值批量设置 需哈希标签
Pipeline 高效非原子批量操作 需哈希标签或分片
Lua脚本 复杂逻辑或原子性要求高 需哈希标签
事务 顺序执行且需条件判断 需哈希标签

选择建议:若无原子性要求,优先使用Pipeline ;若需原子性且逻辑简单,使用Lua脚本

相关推荐
香蕉可乐荷包蛋24 分钟前
Python面试问题
开发语言·python·面试
ErizJ34 分钟前
Golang|分布式索引架构
开发语言·分布式·后端·架构·golang
.生产的驴35 分钟前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
八股文领域大手子43 分钟前
深入浅出限流算法(三):追求极致精确的滑动日志
开发语言·数据结构·算法·leetcode·mybatis·哈希算法
几度泥的菜花1 小时前
优雅实现网页弹窗提示功能:JavaScript与CSS完美结合
开发语言·javascript·css
weixin_307779131 小时前
AWS Glue ETL设计与调度最佳实践
开发语言·数据仓库·云计算·etl·aws
兜小糖的小秃毛2 小时前
文号验证-同时对两个输入框验证
开发语言·前端·javascript
bxlj_jcj2 小时前
如何实现Redis和Mysql中数据双写一致性
redis·缓存·架构
编程在手天下我有2 小时前
Redis 数据类型全览:特性、场景与操作实例
数据库·redis·数据结构与算法
左灯右行的爱情2 小时前
缓存并发更新的挑战
jvm·数据库·redis·后端·缓存