redis外层结构(不含db):
String 类型的底层数据结构
SDS
这个下面又分为三种编码:
- int :
- 假设操作系统为32位,超过2 ^ 31 - 1 则会转变成embstr,我这里时64位,2 ^ 63 - 1为 9223372036854775807
- 在后面追加字符串则直接转换成row,如 append key value
- embstr
- embstr是不可变的,如果使用append追加,则直接变成row
- 少于44字节的字符串
- row (这里就不贴图了,情景上面都囊括了)
- 超过44个字节的字符串,
- 以上情况变化而来
注意:
以上情况都是不可逆的。
List类型的底层数据结构
quicklist
Hash类型的底层数据结构
- ziplist 压缩列表
ziplist是一个经过特殊编码的,由连续内存块组成的双向链表。它不存储指向上一个链表节点和指向下一个链表节点的指针,而是存储上一个节点长度和当前节点长度。
- 一个hash对象保存的field数量<512个
- 一个hash对象中所有的field和value的字符串长度都 < 64byte
typedef struct zlentry{
unsigned int prevrawlensize; // 存储上个链表节点的长度数值需要的字节数
unsigned int prevarawlen; // 上一个链表节点占用长度
unsigned int lensize; // 存储当前链表节点长度数值所需要的字节数
unsigned int len; //存储当前链表节点占用的长度
unsigned int headersize; //当前链表头部大小(prevrawlensize+lensize)
unsigned char encoding; //编码方式
unsigned char *p; //压缩链表以字符串的形式保存,该指针指向当前节点起始位置
} zlentry;
- hashtable
dict
dictht
dictEntry
dictEntry
...
dictht
dictEntry
dictEntry
...
typedef struct dictEntry{
void *key; // key 定义
union {
void *val; //value定义
unit64_t u64;
int64_t s64;
double d;
} v;
struct dicEntry *next;
}
Set类型的底层数据结构
- intSet
- hashtable
Zset类型的底层数据结构
- ziplist
- skiplist +
其它数据类型
位图 bitmaps
超日志 hyperloglogs
地理空间 geospatial