redis数据结构内存占用分析-string类型

475 阅读2分钟

redis概况

redis数据类型

常用数据类型有以下几种:

  • string
  • list
  • set
  • zset
  • hash
  • stream

redis整体存储结构

未命名(1).png

redis内存分配器

默认jmelloc 分配尺寸为8, 16, 32, 48, 64...

  • [0-16] --字节对齐-->8

  • [16-128] --字节对齐-->16

  • [128-256] --字节对齐-->32

  • [256-512] --字节对齐-->64

作者:romandion
链接:www.jianshu.com/p/41852483e…
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

具体存储分析

以下系列文章均使用redis7.0版本,64位系统

情景一

set 123 123 memory usage 123 // 48byte debug object 123 // encoding int 分析:

  • redis-object头部占用16个字节
  • key从采用sds动态字符串存储,占用8个字节
  • value采用int类型编码存储,占用8个字节,但是数字本身存储在redis-object中
  • 内存分配器,分配的尺寸为48个字节(如果内存分配器能分配40个字节,那么,上面的对象会占用40个字节) 总共48个字节
typedef struct redisObject {

    unsigned type:4;  //redisObject的数据类型,4个bits
    unsigned encoding:4;//redisObject的编码类型,4个bits
    /* LRU time (relative to global lru_clock) or

       * LFU data (least significant 8 bits frequency

       * and most significant 16 bits access time). */

    unsigned lru:LRU_BITS;  // 24位
    int refcount;
    void *ptr;
} robj;

struct __attribute__ ((__packed__)) sdshdr8 {

    uint8_t len; /* used */

    uint8_t alloc; /* excluding the header and null terminator */

    unsigned char flags; /* 3 lsb of type, 5 unused bits */

    char buf[];
};

情景二

set 123 1234567891234567891234   // 22*3> (int64)`
debug object 123                // encoding embstr
memory usage 123               // 80字节
// key redis-object + sds8 = 24个字节,实际分配32个字节
// value redis-object + sds sds 字符长度小于等于44,采用embstr编码
// 16 + 4字节sds8头部 + 22 42个字节,分配48个字节
// 总计分配80字节
set 123 12345678912345678912 // 字符长度超过20就是embstr编码