redis -- 各种类型的底层数据结构

redis外层结构(不含db):

String 类型的底层数据结构

SDS
这个下面又分为三种编码:

  • int
  1. 假设操作系统为32位,超过2 ^ 31 - 1 则会转变成embstr,我这里时64位,2 ^ 63 - 1为 9223372036854775807
  2. 在后面追加字符串则直接转换成row,如 append key value
    在这里插入图片描述
  • embstr
  1. embstr是不可变的,如果使用append追加,则直接变成row
  2. 少于44字节的字符串
    在这里插入图片描述
  • row (这里就不贴图了,情景上面都囊括了)
  1. 超过44个字节的字符串,
  2. 以上情况变化而来

注意:
以上情况都是不可逆的。

List类型的底层数据结构

quicklist

Hash类型的底层数据结构

  • ziplist 压缩列表
    ziplist是一个经过特殊编码的,由连续内存块组成的双向链表。它不存储指向上一个链表节点和指向下一个链表节点的指针,而是存储上一个节点长度和当前节点长度。
  1. 一个hash对象保存的field数量<512个
  2. 一个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类型的底层数据结构

  1. intSet
  2. hashtable

Zset类型的底层数据结构

  1. ziplist
  2. skiplist +

其它数据类型

位图 bitmaps
超日志 hyperloglogs
地理空间 geospatial

猜你喜欢

转载自blog.csdn.net/weixin_41725792/article/details/110117125