第2章 简单动态字符串

Huan Lee Lv5

Rdis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。

Redis中所有可修改的字符串值都会用SDS表示, 如键值对的键, 字符串对象, 缓冲区等等.

2.1 SDS的定义

Untitled
Untitled

  • SDS遵循C字符串以‘\0’结尾的惯例, 从而可以复用C字符串库中的函数
  • 该空字符串既不属于len, 也不属于free

2.2 SDS与C字符串的区别

可以将SDS视为对C语言字符串的简单封装, 以满足安全性, 效率以及功能上的要求.

  • 获取字符串长度: O(N) → O(1)

  • 杜绝缓冲区溢出: 在拼接操作时进行检查, 防止溢出

  • 减少修改字符串时带来的内存重分配次数

    • 空间预分配: 当SDS变长后长度小于1MB, 程序将分配和len属性同样大小的未使用空间(free == len); 当重分配后长度≥1MB, 会额外分配1MB的未使用空间(free=1MB)

    • 惰性空间释放: 需要缩短SDS时, 并不立即使用内存重分配来回收缩短后的字节, 而是使用free属性暂时记录起来, 等待将来使用. 需要真正释放未使用空间, 需要使用专用的API.

  • 二进制安全: SDS API是二进制安全的, 不会对其中的数据做任何限制, 过滤, 或者假设, 数据写入时是什么样, 读取时就是什么样. 因此SDS不仅可以保存文本, 还能保存二进制数据

  • 兼容部分C字符串函数

2.3 SDS API

Untitled

Untitled

  • Title: 第2章 简单动态字符串
  • Author: Huan Lee
  • Created at : 2023-08-24 10:10:49
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/24/notion-第2章 简单动态字符串-7992ce8b/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
第2章 简单动态字符串