Redis-快速列表原理源码分析
1、早期版本存储list集合,采用ziplist和linkedlist,但由于链表的附加空间高,prev和next就要占去16个字节,而且每个节点的内存都要单独分配,会加剧内存的碎片化,所以后面的版本对结构进行了改造,使用快速列表(quicklist)
1)实例
> rpush codehole go java python (integer) 3 > debug object codehole Value at:0x7fec2dc2bde0 refcount:1 encoding:quicklist serializedlength:31 lru:6101643 lru_seconds_idle:5 ql_nodes:1 ql_avg_node:3.00 ql_ziplist_max:-2 ql_compressed:0 ql_uncompressed_size:29 |
quicklist是ziplist和linklist的混合体,他将linkedlist按段切分,每一段使用ziplist紧凑存储,东哥ziplist之间使用双向指针窜接起来,如下图所示
2)quicklist结构体
struct quicklist { quicklistNode* head; quicklistNode* tail; long count; // 元素总数 int nodes; // ziplist 节点的个数 int compressDepth; // LZF 算法压缩深度 ... } struct quicklistNode { quicklistNode* prev; quicklistNode* next; ziplist* zl; // 指向压缩列表 int32 size; // ziplist 的字节总数 int16 count; // ziplist 中的元素数量 int2 encoding; // 存储形式 2bit,原生字节数组还是 LZF 压缩存储 ... } struct ziplist_compressed { int32 size; byte[] compressed_data; } struct ziplist { ...//上诉有 }
|
Redis为了进一步节省空间,还会对ziplist使用LZF算法进行压缩存储,还可以选择压缩深度。
2、配置参数list-max-ziplist-size:控制每个ziplist存元素的数量,quicklist内部默认单个ziplist长度为8k字节
3、配置参数 list-compress-depth:压缩实际深度
1)quicklist默认压缩深度是0,即不压缩
2)为了支持快速的push/pop,quicklist首尾俩个ziplist不压缩,此时深度为1
3)quicklist首尾第一个ziplist及第二个都不压缩,那么该参数为2,以此类推。
- Redis-跳跃列表原理源码分析
- Redis-紧凑列表源码原理分析
- redis源码分析(一)复习redis命令、持久化方案、主从同步原理、配置
- Redis-基树数源码原理分析
- Redis压缩列表原理与应用分析
- redis事务实现原理(源码分析)【转】
- Redis-LFU与LRU内部实现原理源码分析
- redis ziplist压缩列表的源码分析
- [置顶] Spring Boot系列十二 通过redis实现Tomcat集群的Session同步及从源码分析其原理
- Redis压缩列表原理与应用分析
- Redis源码剖析--快速列表quicklist
- redis源码命令分析--列表lists
- 【redis源码分析】压缩列表---ziplist
- Redis源码分析(七)——压缩列表Ziplist
- 天纵智能软件快速开发列表+统计图分析插件
- softirq原理以及源码分析(转)
- 【Redis源码剖析】 - Redis数据类型之列表List
- ANDROID移植: WIFI设计原理(源码分析
- 插入排序:2路插入排序原理分析及源码演示
- MyBatis 源码分析 - 缓存原理