在Redis中,当一个列表键仅包含少量列表项,且每个列表项为小整数值或短字符串时,Redis会使用压缩列表(ziplist)作为底层实现,以节约内存。
压缩列表由连续的内存块组成,包含多个节点,每个节点可保存字节数组或整型值。节点结构如图所示,包含previous_entry_length、encoding和content三个部分。
节点的previous_entry_length域以字节单位记录前一个节点的总长度,长度为1字节或5字节。encoding域记录content域数据类型与长度,分为1字节、2字节和5字节三种。content域保存当前节点值,类型与长度由encoding域指定。
当多个连续节点长度小于254字节时,previous_entry_length域为1字节。插入或删除节点可能导致previous_entry_length域扩展为5字节,此过程称为连锁更新,可能需要多次内存重新分配,复杂度为O(N^2)。但实际中,连锁更新发生的概率较低。
压缩列表支持多种API操作,包括创建、添加元素、删除节点和查找元素。具体实现细节涉及内存管理与更新逻辑。
相关参考资料:
《Redis设计与实现(第一版)》
Redis的一个历史bug及其后续改进
Redis学习笔记&源码阅读--压缩列表-操作
redis-6.06 底层数据结构——压缩列表
在Redis中,当一个列表键仅包含少量列表项,且每个列表项为小整数值或短字符串时,Redis会使用压缩列表(ziplist)作为底层实现,以节约内存。压缩列表由连续的内存块组成,包含多个节点,每个节点可保存字节数组或整型值。节点结构如图所示,包含previous_entry_length、encoding和content三个部分。节点的previo...