文章目录1. C 语言字符串的“致命弱点”\02. Redis 的解决方案SDS (Simple Dynamic String)3. 为什么这被称为“二进制安全”4. 深度对比总结要理解 Redis 的“二进制安全Binary Safety”最直接的方法就是对比它与C 语言传统字符串处理方式的区别。简单来说二进制安全意味着Redis 不会对你存入的二进制数据进行任何解释、限制或过滤。你存进去是什么取出来就是什么。1. C 语言字符串的“致命弱点”\0在 C 语言中字符串是以\0ASCII 码为 0 的空字符作为结束标志的。执行逻辑当程序读取字符串时它会从头开始扫一旦遇到\0就认为这个字符串结束了。后果如果你想在字符串中间存入一张图片或一个压缩包的二进制数据而这些数据中恰好包含\0C 语言函数就会“自作聪明”地提前截断导致数据丢失。2. Redis 的解决方案SDS (Simple Dynamic String)Redis 并没有直接使用 C 语言的字符串表示而是自己封装了一个结构叫做SDS。它的核心改进在于显式保存字符串的长度。structsdshdr{intlen;// 已使用的字节长度intfree;// 未使用的字节长度charbuf[];// 实际保存数据的字节数组};不再数\0当 Redis 需要读取数据时它不会去扫描\0而是直接查看len属性。长度决定一切哪怕你的数据里有 100 个\0Redis 也会根据len的指示老老实实地把这 100 个字节全部读出来。3. 为什么这被称为“二进制安全”“安全”在这里的意思是数据的原始二进制位Bit是受保护的。因为 Redis 不依赖特殊的转义字符或结束符来处理数据所以它可以存储任何形式的二进制数据包括图片/视频/音频的字节流。Protobuf/JSON序列化后的对象。加密后的密文密文往往包含大量不可见字符和\0。4. 深度对比特性C 语言原生字符串Redis SDS (String)结束判断扫描到\0停止根据len长度直接读取内容限制不能包含\0否则被截断无限制二进制安全获取长度需要遍历整个字符串O ( n ) O(n)O(n)直接读取len变量O ( 1 ) O(1)O(1)缓冲区溢出容易发生如果不检查长度自动扩容非常安全总结Redis 依然会在buf数组的末尾补一个\0这仅仅是为了兼容某些 C 语言标准的库函数比如打印日志。但在处理你的业务数据时它完全不以\0为准。这种设计让 Redis 的 String 类型成为了一块**“万能内存胶布”**可以贴任何类型的数据。既然你提到了二进制安全你是在研究 Redis 如何缓存复杂的 Java 对象序列化结果吗