SDS简单动态字符串:为什么Redis不用C字符串?

引言 在Redis中,我们使用SET和GET命令操作字符串,看起来和C语言的字符串没什么区别。但实际上,Redis并没有使用C语言传统的字符串表示(以空字符’\0’结尾的字符数组),而是自己实现了一种名为SDS(Simple Dynamic String,简单动态字符串)的抽象类型。 为什么要重新实现字符串?SDS有什么优势?今天我们深入源码,揭开SDS的神秘面纱。 一、C字符串的局限性 1.1 C字符串的表示 // C语言字符串 char str[] = "Redis"; // 内存布局 +---+---+---+---+---+---+ | R | e | d | i | s | \0| +---+---+---+---+---+---+ 0 1 2 3 4 5 1.2 存在的问题 问题1:获取字符串长度O(n) // 需要遍历整个字符串直到遇到'\0' size_t len = strlen(str); // O(n) 时间复杂度 // 对于频繁获取长度的场景(如Redis命令),性能损失严重 问题2:不支持二进制数据 // C字符串以'\0'作为结尾标志 char binary_data[] = {0x01, 0x02, 0x00, 0x03}; // ❌ 无法正确处理 // strlen会在遇到0x00时停止,认为字符串结束 // 导致无法存储图片、音频等二进制数据 问题3:容易缓冲区溢出 char dest[5] = "Hi"; char src[] = "Redis"; // ❌ 危险操作:没有检查dest空间是否足够 strcat(dest, src); // 缓冲区溢出!破坏相邻内存 问题4:内存重分配频繁 // 字符串拼接需要重新分配内存 char *str = malloc(6); strcpy(str, "Redis"); // 追加内容,需要重新分配 str = realloc(str, 12); // 每次都要重新分配,性能差 strcat(str, " Fast"); 问题5:不兼容部分C函数 // 很多C函数假设字符串以'\0'结尾 // 对于包含'\0'的二进制数据,这些函数无法正常工作 1.3 Redis的需求 Redis作为高性能数据库,对字符串的需求: ...

2025-01-21 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...