2、列表
- ziplist
- ziplist参数
- entry结构
- entry-data:节点存储的元素
- prelen:记录前驱节点长度
- encoding:当前节点编码格式
- encoding
- encoding属性 使用多个子节点存储节点元素长度,这种多字节数据存储在计算机内存中或者进行网络传输的时的字节顺序称为字节序。
- 大端字节序:低字节数据保存在内存高地址位置,高字节数据保存在内存低地址位置。
- 小端字节序:低字节数据保存在内存低地址位置,高字节数据保存在内存高地址位置。
- CPU处理指令通常按照内存地址增长方向执行的。若使用小端字节序,cpu执行效率会更高。而ziplist就采用小端字节序,所以它有CPU执行优势。
- encoding属性 使用多个子节点存储节点元素长度,这种多字节数据存储在计算机内存中或者进行网络传输的时的字节顺序称为字节序。
- ziplist查找元素
- 从某个节点开始查找,计算当前节点属性(encoding、lensize、len)
- 如果当前节点时字符串编码,则对比传入的内容,有则返回
- 如果节点元素是数值编码,并且还没对查找内容进行编码,则先编码再对比(不需要比对encoding了)
- 对比结束不符合就跳转到下一个节点继续比对
- ziplist插入元素
- 计算前驱节点长度并放入prelen中
- 对插入元素进行内容编码,计算编码后的长度(req)
- 计算prelen长度
- 计算后驱节点长度(nextdiff)
- 重新为ziplist分配内存(当前长度+req+nextdiff)
- 将插入位置后面所有的节点后移
- 修改后驱节点的prelen属性
- 更新zltail属性
- 更新zllen属性
- ziplist级联更新(极端情况)
- 会涉及大量的内存拷贝,所以这个时候应该采用quicklist
- ziplist参数
- quicklit
- quicklist通过将一个ziplist拆分为多个短的ziplist,避免插入或删除元素时候导致大量的内存拷贝。
- 当链表很长的时候,中间节点访问效率较低时,redis会对中间节点进行压缩节省内存空间。
- 将元素插入quicklist头部
- 判断头节点的ziplist是否已满,未满则直接插入
- 若已满则创建新的节点,将元素插入新节点的ziplist中
ziplist结构紧凑,使用一整块内存存储链表的所有数据,其只有一种编码格式OBJ_ENCODING_QUICKLIST