*Redis SETRANGE 命令

SETRANGE 从指定偏移位置开始覆盖字符串的一部分,实现字符串的原子性部分修改。


*语法

SETRANGE key offset value

*参数说明

参数 类型 必填 说明
key String 键名
offset Integer 起始偏移位置,从 0 开始
value String 要写入的字符串内容

*返回值

  • Integer:修改后字符串的总长度

*时间复杂度

O(1),不计算复制新字符串的时间。通常写入内容很小,均摊复杂度为 O(1);否则为 O(M),M 为 value 的长度。


*示例

*基本用法

> SET key "Hello World"
OK
> SETRANGE key 6 "Redis"
(integer) 11
> GET key
"Hello Redis"

*在空字符串中插入内容

> SETRANGE mykey 7 "Redis"
(integer) 12
> GET mykey
"\x00\x00\x00\x00\x00\x00\x00Redis"

*追加数据

> SET cache "prefix"
OK
> SETRANGE cache 6 "-suffix"
(integer) 13
> GET cache
"prefix\x00-suffix"

*常见错误

错误 原因 解决
ERR offset is out of range offset 超过允许的最大值(512 MB) 检查 offset 范围
WRONGTYPE Operation against a key holding the wrong kind of value key 已存在但类型不是 String 确保 key 是 String 类型

*最佳实践

  • 局部更新:适合需要修改字符串中某一段内容的场景,避免 GET + SET 两次操作
  • 空位填充:当 offset 大于当前字符串长度时,中间会用 \x00(空字节)填充
  • 大 key 风险:修改极大字符串时可能阻塞,评估是否适合拆分存储
  • 配合 GETRANGEGETRANGE 读取子串,SETRANGE 写入子串,实现字符串的局部读写

*FAQ

Q1: SETRANGE 和 APPEND 有什么区别? A: APPEND 总是在字符串末尾追加;SETRANGE 可以在任意偏移位置覆盖写入,偏移位置超出当前长度时中间补 \x00

Q2: offset 超出当前字符串长度会怎样? A: 字符串会扩展,中间用 \x00(空字节)填充,最终返回扩展后的总长度。

Q3: 可以用 SETRANGE 修改 Bitmap 吗? A: 不建议。Bitmap 的位操作应使用 SETBIT / GETBIT,SETRANGE 按字节操作会破坏位级结构。