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只需要一次内存申请

posted @ 2021-04-08 01:02  車輪の唄  阅读(27)  评论(0编辑  收藏  举报  来源