4.4 ZIPLIST编码方式
压缩列表是Redis为了节约内存而开发的,它是一块顺序表(顺序存储结构,内存空间连续),一个压缩列表中可以包含多个entry节点,每个entry节点可以保存一个字节数组或者一个整数值 。

文章插图
zlbytes:记录了压缩列表的大小,占4个字节 。如果存在一个指针P指向压缩列表的起始位置,就可以根据P+zltail得到最后一个节点的地址 。
zltail:记录了压缩列表表尾节点距离起始位置的大小,占4个字节 。
zllen:记录了压缩列表中节点的个数,占2个字节 。
entry:压缩列表中的节点,大小由节点中保存的内容决定 。
zlend:压缩列表的结束标志,占1个字节 。

文章插图
4.5 LINKEDLIST编码方式

文章插图
Redis使用listNode结构来表示链表中的节点 。
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;}listNode;每个listNode节点分别包含指向前驱和后继节点的指针以及指向元素的指针 。
Redis使用list结构来持有listNode
typedef struct list { listNode *head; listNode *tail; unsigned long len; void dup(void *ptr); //节点复制函数 void free(void *ptr); //节点值释放函数 int match(void *ptr , void *key); //节点值比对函数}list;
head属性:指向表头节点的指针 。4.6 INTSET编码方式
tail属性:指向表尾节点的指针 。
len属性:存储链表中节点的个数 。

文章插图
Redis使用intset结构来表示整数集合 。
typedef struct inset { uint32_t encoding; uint32_t length; int8_t contents[];}intset;
encoding属性:contents数组的类型,支持INTESET_ENC_INT16、INTESET_ENC_INT32、INTESET_ENC_INT64 。Contents升级
length属性:存储整数集合中元素的个数 。
contents数组:整数集合的底层实现,集合中的每个元素在数组中都会按照值从小到大进行排序同时保证元素不会重复 。
当往数组中添加一个比当前数组类型还要大的元素时,将要进行升级 。
1.根据新元素的类型对数组进行扩容( (length + 1) * 新类型大小)

文章插图
2.将数组中现有的元素都转换成与新元素相同的类型,并将转换后的元素移动到正确的位置上 。

文章插图
3.将新元素添加到数组中 。

文章插图
4.修改intset中的encoding属性为新的类型 。
Contents降级
contents数组不支持降级,一旦为contents数组进行了升级那么就要一直保持升级后的状态 。
4.7 HT编码方式

文章插图
4.8 SKIPLIST编码方式

文章插图
通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的 。
Redis使用zskiplistNode结构来表示跳跃表中的节点.
typedef struct zskiplistNode { struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; }level[]; struct zskiplistNode *backward; double score; robj *obj;}zskiplistNode
level[]数组:用于存储zskiplistLevel,每个zskiplistLevel都包含forward和span属性 。每次创建一个新的跳跃表节点时,会随机生成一个介于1到32之间的值作为level数组的大小 。
【一文详尽解析Redis的设计原理】forward属性为指向表尾方向的其他节点,span属性则记录了forward指针所指向的节点距离当前节点的跨度(forward指针遵循同层连接的原则)
backward属性:指向上一个节点的指针 。
score属性:存储元素的分数 。
obj属性:指向元素的指针(redisObject->sds)
Redis使用zskiplist结构来持有zskiplistNode
typedef struct zskiplist { struct zskiplistNode *header,*tail; unsigned long length; int level;}zskiplist;
header属性:指向表头节点的指针 。
tail属性:指向表尾节点的指针 。
推荐阅读
- 一文教你读懂如何手工配置DBControl
- Linux循环设备/dev/loop解析
- Nginx为什么高效?一文搞明白Nginx核心原理
- 基本概念+优缺点+美团应用案例 一文看懂逻辑回归算法
- 右眼皮跳测吉凶风水解析
- 武则天亲自教你如何做大佬,一文读懂10条职场生存法则
- 十二时辰吉凶风水解析
- 光纤是怎么到你家的?一文了解清楚
- 一文看懂2021年华为开发者大会
- 一文带你揭穿葡萄酒中的山寨货、水货、假货
