*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 风险:修改极大字符串时可能阻塞,评估是否适合拆分存储
- 配合 GETRANGE:GETRANGE 读取子串,SETRANGE 写入子串,实现字符串的局部读写
*FAQ
Q1: SETRANGE 和 APPEND 有什么区别?
A: APPEND 总是在字符串末尾追加;SETRANGE 可以在任意偏移位置覆盖写入,偏移位置超出当前长度时中间补 \x00。
Q2: offset 超出当前字符串长度会怎样?
A: 字符串会扩展,中间用 \x00(空字节)填充,最终返回扩展后的总长度。
Q3: 可以用 SETRANGE 修改 Bitmap 吗? A: 不建议。Bitmap 的位操作应使用 SETBIT / GETBIT,SETRANGE 按字节操作会破坏位级结构。