*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),返回空字符串。