为什么会选择44作为两种编码的分界点?在3.2版本之前为什么是39?这两个值是怎么得出来的呢?
1) 计算RedisObject占用的字节大小
struct RedisObject {
int4 type; // 4bits
int4 encoding; // 4bits
int24 lru; // 24bits
int32 refcount; // 4bytes = 32bits
void *ptr; // 8bytes,64-bit system
}
type: 不同的redis对象会有不同的数据类型(string、list、hash等),type记录类型,会用到4bits。
encoding:存储编码形式,用4bits。
lru:用24bits记录对象的LRU信息。
refcount:引用计数器,用到32bits。
*ptr:指针指向对象的具体内容,需要64bits。
计算: 4 + 4 + 24 + 32 + 64 = 128bits = 16bytes
第一步就完成了,RedisObject对象头信息会占用16字节的大小,这个大小通常是固定不变的.
2) sds占用字节大小计算
旧版本:
struct SDS {
unsigned int capacity; // 4byte
unsigned int len; // 4byte
byte[] content; // 内联数组,长度为 capacity
}
这里的unsigned int 一个4字