*Redis GETRANGE 命令
GETRANGE 返回字符串键值中指定闭区间 [start, end] 的子字符串。支持负索引(-1 表示最后一个字符)。
*语法
GETRANGE key start end
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 键名 |
| start | Integer | 是 | 起始偏移量(包含),从 0 开始;负值表示从末尾倒数 |
| end | Integer | 是 | 结束偏移量(包含);负值表示从末尾倒数 |
*返回值
- String:截取后的子字符串
- 空字符串:start > end 或 key 不存在时返回
"" - Error:key 不是字符串类型
*时间复杂度
O(N),其中 N 为返回字符串的长度。对超长字符串执行大范围截取会消耗较多资源。
*示例
*基本用法
> SET mykey "This is a string"
OK
> GETRANGE mykey 0 3
"This"
> GETRANGE mykey -3 -1
"ing"
> GETRANGE mykey 0 -1
"This is a string"
*处理越界索引
> GETRANGE mykey 10 100
"string"
*负索引截取末尾
> GETRANGE mykey -6 -1
"string"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE Operation against a key holding the wrong kind of value | key 不是字符串类型 | 仅对 String 类型的键有效 |
| ERR value is not an integer or out of range | start/end 不是整数 | 传入有效的整数索引 |
*最佳实践
- 用于日志、长文本的部分读取,避免 GET 全量传输大 value
- 截取范围超出字符串长度时 Redis 自动处理为最大边界,不会报错
- 与 SETRANGE 配合使用可实现字符串的部分修改能力
- 对二进制数据同样有效(Redis 字符串是二进制安全的)
*FAQ
Q1: GETRANGE 的索引是字节还是字符? A: GETRANGE 按字节偏移计算。对纯 ASCII 字符串,字节偏移等同于字符偏移;但对 UTF-8 多字节字符(如中文),一个字符可能占 3 个字节,截取时需要注意不要截断字符编码。
Q2: start > end 会怎样?
A: 返回空字符串 "",不会报错。
Q3: 负索引的边界情况? A: -1 表示最后一个字节,-2 表示倒数第二个,以此类推。如果 start 和 end 都是负数且 start 在 end 之后(如 -1 到 -3),返回空字符串。