SETRANGE:对字符串值的指定索引范围进行设置

通过使用 SETRANGE 命令,用户可以将字符串键的值从索引 index 开始的部分替换为指定的新内容,被替换内容的长度取决于新内容的长度:

  1. SETRANGE key index substitute

SETRANGE 命令在执行完设置操作之后,会返回字符串值当前的长度作为结果。

比如说,我们可以通过执行以下命令,将 message 键的值从原来的 "hello world" 修改为 "hello Redis"

  1. redis> GET message
  2. "hello world"
  3.  
  4. redis> SETRANGE message 6 "Redis"
  5. (integer) 11 -- 字符串值当前的长度为 11 字节
  6.  
  7. redis> GET message
  8. "hello Redis"

这个例子中的 SETRANGE 命令会将 message 键的值从索引 6 开始的内容替换为 "Redis" ,图 2-7 展示了这个命令的执行过程。


图 2-7 SETRANGE 命令修改 message 键的过程_images/IMAGE_SETRANGE_MESSAGE_1.png_images/IMAGE_SETRANGE_MESSAGE_2.png_images/IMAGE_SETRANGE_MESSAGE_3.png_images/IMAGE_SETRANGE_MESSAGE_4.png_images/IMAGE_SETRANGE_MESSAGE_5.png_images/IMAGE_SETRANGE_MESSAGE_6.png

自动扩展被修改的字符串

当用户给定的新内容比被替换的内容更长时,SETRANGE 命令就会自动扩展被修改的字符串值,从而确保新内容可以顺利写入。

比如说,以下代码就展示了如何通过 SETRANGE 命令,将 message 键的值从原来的 11 字节长修改为 41 字节长:

  1. redis> GET message
  2. "hello Redis"
  3.  
  4. redis> SETRANGE message 5 ", this is a message send from peter."
  5. (integer) 41
  6.  
  7. redis> GET message
  8. "hello, this is a message send from peter."

图 2-8 展示了这个 SETRANGE 命令扩展字符串并进行写入的过程。


图 2-8 SETRANGE 命令的执行过程示例

SETRANGE 命令执行之前的字符串值_images/IMAGE_EXPAND_SETRANGE_1.png将字符串值扩展至 41 字节长_images/IMAGE_EXPAND_SETRANGE_2.png对字符串值进行设置_images/IMAGE_EXPAND_SETRANGE_3.png

在值里面填充空字节

SETRANGE 命令除了会根据用户给定的新内容自动扩展字符串值之外,还会根据用户给定的 index 索引扩展字符串:当用户给定的 index 索引超出字符串值的长度时,字符串值末尾直到索引 index-1 之间的部分将使用空字节进行填充,换句话说,这些字节的所有二进制位都会被设置为 0

举个例子,对于字符串键 greeting 来说:

  1. redis> GET greeting
  2. "hello"

当我们执行以下命令时:

  1. redis> SETRANGE greeting 10 "world"
  2. (integer) 15

SETRANGE 命令会先将字符串值扩展为 15 个字节长,然后将 "hello" 末尾直到索引 9 之间的所有字节都填充为空字节,最后再将索引 10 到索引 14 的内容设置为 "world" 。图 2-9 展示了这个扩展、填充、最后设置的过程。


图 2-9 SETRANGE greeting 10 "world" 的执行过程

执行 SETRANGE 之前的字符串值_images/IMAGE_FILLED_SETRANGE_1.png将字符串值从 5 个字节扩展至 15 个字节_images/IMAGE_FILLED_SETRANGE_2.png使用空字节填充索引 5 至索引 9_images/IMAGE_FILLED_SETRANGE_3.png将索引 10 至索引 14 的内容设置为 “world”_images/IMAGE_FILLED_SETRANGE_4.png


通过执行 GET 命令,我们可以取得 greeting 键在执行 SETRANGE 命令之后的值:

  1. redis> GET greeting
  2. "hello\x00\x00\x00\x00\x00world"

可以看到,greeting 键的值现在包含了多个 \x00 符号,而每个 \x00 符号就代表一个空字节。

其他信息

属性
复杂度O(N),其中 N 为被修改内容的长度。
版本要求SETRANGE 命令从 Redis 2.2.0 开始可用。