redis概况
redis数据类型
常用数据类型有以下几种:
- string
- list
- set
- zset
- hash
- stream
redis整体存储结构
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编码