Redis之setrange和getrange

SETRANGE key offset value

  • 可用版本: >= 2.2.0
  • 时间复杂度:对于长度较短的字符串,命令的平摊复杂度O(1);对于长度较大的字符串,命令的复杂度为 O(M) ,其中 M 为 value 的长度。

命令功能

  • 从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。
  • 不存在的键 key 当作空白字符串处理。

SETRANGE 命令会确保字符串足够长以便将 value 设置到指定的偏移量上, 如果键 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset 是 10 ), 那么原字符和偏移量之间的空白将用零字节(zerobytes, “\x00” )进行填充。

因为 Redis 字符串的大小被限制在 512 兆(megabytes)以内, 所以用户能够使用的最大偏移量为 2^29-1(536870911) , 如果你需要使用比这更大的空间, 请使用多个 key 。

当生成一个很长的字符串时, Redis 需要分配内存空间, 该操作有时候可能会造成服务器阻塞(block)。 在2010年出产的Macbook Pro上, 设置偏移量为 536870911(512MB 内存分配)将耗费约 300 毫秒, 设置偏移量为 134217728(128MB 内存分配)将耗费约 80 毫秒, 设置偏移量 33554432(32MB 内存分配)将耗费约 30 毫秒, 设置偏移量为 8388608(8MB 内存分配)将耗费约 8 毫秒。

返回值

SETRANGE 命令会返回被修改之后, 字符串值的长度。

代码示例

对非空字符串执行 SETRANGE 命令:

  1. set rumenz "testVal"
  2. OK
  3. > setrange rumenz 10 "One"
  4. (integer) 13
  5. > get rumenz
  6. "testVal\x00\x00\x00One"

对空字符串/不存在的键执行 SETRANGE 命令:

  1. > setrange rumenz 10 "rumenz"
  2. (integer) 16
  3. > get rumenz
  4. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00rumenz"

GETRANGE key start end

  • 可用版本: >= 2.4.0
  • 时间复杂度: O(N),其中 N 为被返回的字符串的长度。

命令功能

  • 返回键 key 储存的字符串值的指定部分, 字符串的截取范围由 start 和 end 两个偏移量决定 (包括 start 和 end 在内)。

负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符, 以此类推。

GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

GETRANGE 命令在 Redis 2.0 之前的版本里面被称为 SUBSTR 命令。

返回值

GETRANGE 命令会返回字符串值的指定部分。

代码示例

  1. > set rumenz "testVal"
  2. OK
  3. > getrange rumenz 0 4
  4. "testV"
  5. > getrange rumenz 1 5
  6. "estVa"
  7. > getrange rumenz 0 -1
  8. "testVal"
  9. > getrange rumenz 0 1000
  10. "testVal"

返回笔记列表
入门小站