SETRANGE:对字符串值的指定索引范围进行设置
通过使用 SETRANGE
命令,用户可以将字符串键的值从索引 index
开始的部分替换为指定的新内容,被替换内容的长度取决于新内容的长度:
- SETRANGE key index substitute
SETRANGE
命令在执行完设置操作之后,会返回字符串值当前的长度作为结果。
比如说,我们可以通过执行以下命令,将 message
键的值从原来的 "hello world"
修改为 "hello Redis"
:
- redis> GET message
- "hello world"
- redis> SETRANGE message 6 "Redis"
- (integer) 11 -- 字符串值当前的长度为 11 字节
- redis> GET message
- "hello Redis"
这个例子中的 SETRANGE
命令会将 message
键的值从索引 6 开始的内容替换为 "Redis"
,图 2-7 展示了这个命令的执行过程。
图 2-7 SETRANGE
命令修改 message
键的过程
自动扩展被修改的字符串
当用户给定的新内容比被替换的内容更长时,SETRANGE
命令就会自动扩展被修改的字符串值,从而确保新内容可以顺利写入。
比如说,以下代码就展示了如何通过 SETRANGE
命令,将 message
键的值从原来的 11 字节长修改为 41 字节长:
- redis> GET message
- "hello Redis"
- redis> SETRANGE message 5 ", this is a message send from peter."
- (integer) 41
- redis> GET message
- "hello, this is a message send from peter."
图 2-8 展示了这个 SETRANGE
命令扩展字符串并进行写入的过程。
图 2-8 SETRANGE
命令的执行过程示例
SETRANGE 命令执行之前的字符串值将字符串值扩展至 41 字节长对字符串值进行设置
在值里面填充空字节
SETRANGE
命令除了会根据用户给定的新内容自动扩展字符串值之外,还会根据用户给定的 index
索引扩展字符串:当用户给定的 index
索引超出字符串值的长度时,字符串值末尾直到索引 index-1
之间的部分将使用空字节进行填充,换句话说,这些字节的所有二进制位都会被设置为 0
。
举个例子,对于字符串键 greeting
来说:
- redis> GET greeting
- "hello"
当我们执行以下命令时:
- redis> SETRANGE greeting 10 "world"
- (integer) 15
SETRANGE
命令会先将字符串值扩展为 15
个字节长,然后将 "hello"
末尾直到索引 9
之间的所有字节都填充为空字节,最后再将索引 10
到索引 14
的内容设置为 "world"
。图 2-9 展示了这个扩展、填充、最后设置的过程。
图 2-9 SETRANGE greeting 10 "world"
的执行过程
执行 SETRANGE 之前的字符串值将字符串值从 5 个字节扩展至 15 个字节使用空字节填充索引 5 至索引 9将索引 10 至索引 14 的内容设置为 “world”
通过执行 GET
命令,我们可以取得 greeting
键在执行 SETRANGE
命令之后的值:
- redis> GET greeting
- "hello\x00\x00\x00\x00\x00world"
可以看到,greeting
键的值现在包含了多个 \x00
符号,而每个 \x00
符号就代表一个空字节。
其他信息
属性 | 值 |
---|---|
复杂度 | O(N),其中 N 为被修改内容的长度。 |
版本要求 | SETRANGE 命令从 Redis 2.2.0 开始可用。 |