- 用法
-
SETRANGE key offset value
- 复杂度
- O(1),不包括在原地复制新字符串所需的时间。通常,此字符串非常小,因此分摊复杂度为 O(1)。否则,复杂度为 O(M),其中 M 是值参数的长度。
- 自
- 2.2.0
- ACL 类别
- @string, @write, @slow
覆盖存储在 key 处的字符串的一部分,从指定的偏移量开始,长度为 value 的整个长度。如果偏移量大于 key 处字符串的当前长度,则该字符串将用零字节填充以使 offset 适配。不存在的键被视为空字符串,因此此命令将确保它持有足够大的字符串,以便能够在 offset 处设置 value。
请注意,您可以设置的最大偏移量为 2^29 - 1 (536870911),因为 Valkey 字符串限制为 512 兆字节。如果您需要增长超出此大小,可以使用多个键。
警告:当设置最后一个可能的字节,并且存储在 key 中的字符串值尚未包含字符串值,或者包含一个小的字符串值时,Valkey 需要分配所有中间内存,这可能会阻塞服务器一段时间。在 2010 年的 MacBook Pro 上,设置字节号 536870911(512MB 分配)大约需要 300 毫秒,设置字节号 134217728(128MB 分配)大约需要 80 毫秒,设置位号 33554432(32MB 分配)大约需要 30 毫秒,设置位号 8388608(8MB 分配)大约需要 8 毫秒。请注意,一旦完成首次分配,后续对同一 key 的 SETRANGE
调用将不会有分配开销。
模式
得益于 SETRANGE
和类似的 GETRANGE
命令,您可以将 Valkey 字符串用作具有 O(1) 随机访问的线性数组。这在许多实际用例中是一种非常快速高效的存储方式。
示例
基本用法
127.0.0.1:6379> SET key1 "Hello World"
OK
127.0.0.1:6379> SETRANGE key1 6 "Valkey"
(integer) 12
127.0.0.1:6379> GET key1
"Hello Valkey"
零填充示例
127.0.0.1:6379> SETRANGE key2 6 "Valkey"
(integer) 12
127.0.0.1:6379> GET key2
"\x00\x00\x00\x00\x00\x00Valkey"
RESP2/RESP3 回复
整数回复:字符串被命令修改后的长度。