Redis 为什么使用SDS

SDS (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示.

SDS 在 Redis 中的主要作用有以下两个:

  • 实现字符串对象(StringObject);
  • 在 Redis 程序内部用作 char* 类型的替代品;
  • 用 sds 取代 C 默认的 char* 类型

    因为 char* 类型的功能单一, 抽象层次低, 并且不能高效地支持一些 Redis 常用的操作(比如追加操作和长度计算操作), 所以在 Redis 程序内部, 绝大部分情况下都会使用 sds 而不是 char* 来表示字符串。

    在 C 语言中,字符串可以用一个 结尾的 char 数组来表示。

    比如说, hello world 在 C 语言中就可以表示为 “hello world” 。

    这种简单的字符串表示,在大多数情况下都能满足要求,但是,它并不能高效地支持长度计算和追加(append)这两种操作:

    • 每次计算字符串长度(strlen(s))的复杂度为 θ(N)θ(N)θ(N)θ(N) 。
    • 对字符串进行 N 次追加,必定需要对字符串进行 N 次内存重分配(realloc)。

    在 Redis 内部, 字符串的追加和长度计算很常见, 而 APPEND 和 STRLEN 更是这两种操作,在 Redis 命令中的直接映射, 这两个简单的操作不应该成为性能的瓶颈。

    另外, Redis 除了处理 C 字符串之外, 还需要处理单纯的字节数组, 以及服务器协议等内容, 所以为了方便起见, Redis 的字符串表示还应该是二进制安全的: 程序不应对字符串里面保存的数据做任何假设, 数据可以是以 结尾的 C 字符串, 也可以是单纯的字节数组, 或者其他格式的数据。

    考虑到这两个原因, Redis 使用 sds 类型替换了 C 语言的默认字符串表示: sds 既可高效地实现追加和长度计算, 同时是二进制安全的。

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年7月11日
    下一篇 2022年7月11日

    相关推荐

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息