Redis数据库中所有的键都是String类型,String 的底层实现是SDS(Simple Dynamic String)。
SDS主要是对C语言做了一个封装,是的SDS具有动态扩容、O(1)复杂度的长度计算的特点。
主要右三个部分组成:
- len :实际使用长度
- free buf 数组中未使用字节的数量
- char buf[] 用于保存字符串
struct sdshdr{
int len; //记录buf 数组中已使用字节的数量 等于 SDS所保存的字符串的长度
int free;//记录buf数组中未使用的字节数量;
char nuf[ ]; //字节数组,用于保存字符串
}
Redis 中的任意数据类型的键和值都会被封装成⼀个 RedisObject,即 Redis 对象。会在 Redis 对象中主要由三个 字段:当前数据结构的类型、编码⽅式和指向实际数据的指针。
String类型,⾸先会在Redis对象中指明他的类型为OBJ_STRING。
String类型有三种编码⽅式:
1、其最基本的编码⽅式是 RAW 编码,基于简单动态字符串SDS来实现,存储上限为512mb。他就是在内存中申 请⼀个 SDS,然后让 Redis 对象的指针指向 SDS 即可。
2、当要存储的 SDS 的⻓度⼩于 44 字节,就会使⽤ EMBSTR 编码,此时 Redis 对象的头部和 SDS 是在⼀个连续 的内存空间中,申请内存的时候只需要⼀次分配,效率更⾼。为什么是 44 个字节呢?因为Redis对象数据结构中其 头部有 16 个字节。然后SDS中头部 3 个字节,尾巴结束字符⼀个字节,加在⼀起共 20 个字节,20 个字节加上 44 个字节就是 64 个字节,因为 redis 内存分配会以 2 的 n 次⽅进⾏分配,64 个字节不会产⽣内存碎⽚。
3、如果要存储的字符串是⼀个整数,且⼤⼩不超过 8 位⼆进制能表示的范围。就采⽤ int 的编码⽅式,直接让 redis 对象的指针位设置为这个整数
如图: