2.10 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键的过程
2.10.1 自动扩展被修改的字符串
当用户给定的新内容比被替换的内容更长时,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命令的执行过程示例
2.10.2 在值里面填充空字节
SETRANGE命令除了会根据用户给定的新内容自动扩展字符串值之外,还会根据用户给定的index索引扩展字符串。
当用户给定的index索引超出字符串值的长度时,字符串值末尾直到索引index-1之间的部分将使用空字节进行填充,换句话说,这些字节的所有二进制位都会被设置为0。
举个例子,对于字符串键greeting来说:
redis> GET greeting
"hello"
当我们执行以下命令时,SETRANGE命令会先将字符串值扩展为15个字节长,然后将"hello"末尾直到索引9之间的所有字节都填充为空字节,最后再将索引10到索引14的内容设置为"world"。图2-9展示了这个扩展、填充、最后设置的过程。
图2-9 SETRANGE greeting 10 "world"的执行过程
redis> SETRANGE greeting 10 "world" (integer) 15
通过执行GET命令,我们可以取得greeting键在执行SETRANGE命令之后的值:
redis> GET greeting
"hello\x00\x00\x00\x00\x00world"
可以看到,greeting键的值现在包含了多个\x00符号,每个\x00符号代表一个空字节。
2.10.3 其他信息
复杂度:O(N),其中N为被修改内容的长度。
版本要求:SETRANGE命令从Redis 2.2.0开始可用。