原理
Redis数据结构
动态字符串SDS
字符串是redis中非常常见的一个数据结构 redis是由C语言实现 但是底层并没有采用C语言的字符串类型 因为C语言字符串存在很多问题 C语言字符串底层是字符数组
- 获取字符串长度需要运算 因为‘\0’的存在 所以每次获取长度都需要-1 会造成额外的运算
- 非二进制安全 由于‘\0’的存在 所以写入的字符串也不能带有\0 会造成不安全的字符串
- 不可修改 c语言对字符串的申请都是直接申请到常量池里 是不能修改的 而且拼接需要扩容 扩容就要重新申请空间 难以拼接
因此redis就构建了一种新的字符串结构 叫做SDS(Simple Dynamic String) 简单动态字符串
不过SDS底层也是字符串数组 但是SDS的字符数组是自己来维护的 然后SDS结构体声明了很多种 8字节 16字节 32,64字节 5字节的有但是已经被弃用了
SDS之所以叫动态字符串 具备动态扩容的能力 但是由于redis牵扯到模式切换 用户态和内核态切换导致申请内存性能占用太大 所以扩容是内存预分配方法扩容 就是会多申请一些空间
- 如果新字符串小于1M 则新空间为扩展后的字符串长度的两倍+1
- 如果新字符串大于1M 则新空间为扩展后的字符串长度+1M+1
SDS优势
- 获取字符串长度时间是O(1)
- 支持动态扩容
- 减少内存分配
- 二进制安全