Redis使用手册
上QQ阅读APP看书,第一时间看更新

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开始可用。