sds中的两种编码--embded和RAW
embded 和 RAW
使用debug object命令会发现,不同长度的string的encoding有embed和raw两种类型,也是为了节省空间,64字节及以下的string会使用embed存储,以上使用RAW存储(不同redis版本下可能会有不同的界限),之所以使用64为界是因为内存分配函数malloc等都是一次分配2的若干次幂大小的内存,另外即使分配64字节给string使用,content也只有44字节的内存可以存储,原因正是因为下面的redis头对象也占了坑
RedisObject
public class RedisObject {
// 数据类型,只使用4bit
private int4 type;
// 数据的encoding类型,只使用4bit
private int4 encoding;
// 数据的lru信息,只使用24bit
private int24 lru;
// 该数据的引用计数,使用32bit
private int32 refcount;
// 这是个指针,指向数据对象,在64位操作系统下,使用8个字节
private Poniter *p;
}
可以发现,对象头至少使用16个字节,而假使SDS的三个辅助属性都只使用1字节的话,content也就只剩下64-19=45字节的空间可以使用了,还有一个字节用来保存字符串的结尾字符,这个字符通常使用的是null,而在redis中使用的是\0,\0使用了1个字节,content的可用有效字符就仅剩44字节了
1.创建一个sds需要一次内存申请
2.创建一个robj需要两次内存申请(一个是robj, 一个ptr)
3.创建一个emb编码的robj只需要一次内存申请