首页 > 编程知识 正文

map的底层数据结构,redis set底层数据结构

时间:2023-05-03 08:24:16 阅读:128967 作者:2414

ziplist是Redis中某些数据类型的基础数据结构

Redis中类型为hash、List和Sorted List的数据在某些情况下使用ziplist进行存储。

如果混列类型混列类型的数据满足以下条件,则基础使用ziplist存储:

如果散列键值对的数量小于或等于hash-max-ziplist-entries配置中的值,如果默认512密钥值对的中值长度小于或等于hash-max-ziplist-value配置中的值,则默认64为hash类型

列表类型redis列表类型的数据基础使用快速列表进行存储,快速列表基于链接列表zip列表进行实现。

Sorted Set类型如果Sorted Set类型的数据满足以下条件,则基础使用ziplist存储:

如果元素的数量小于或等于zset-max-ziplist-entries配置的值,如果默认的128个元素的值小于或等于zset-max-ziplist-value配置,或者如果Sorted Set类型的数据满足这两个条件,则返回value

ziplist的内存布局ziplist是一种顺序存储结构,由一系列特殊编码的连续内存块组成,与数组类似。 ziplist连续存储在内存中,但与数组不同,ziplist中的每个元素占用的内存大小不同以节省内存,每个节点可以用于存储整数或字符串。

ziplist类似于双向链表,但它不存储指向上一个节点和下一个节点的指针,而是存储上一个节点的长度和当前节点的长度,并牺牲部分读写性能,从而节省内存以换取高效的内存空间利用率

zlbytes :用于记录压缩列表占用的内存字节数,并重新分配压缩列表或计算zlend的位置。 它本身占用了4个字节。

zltail :记录从末尾节点(entry )到开头节点)的偏移量。 此偏移允许您快速确定最后一个入口节点的地址。

zlen :记录了入口节点的数量。 如果zllen的值小于65535,则此值表示节点的数量。 如果zllen的值大于65535,则必须遍历整个压缩列表来确定节点的实际数量。

entry :压缩列表中包含的每个节点。 每个节点的长度由该节点的内容决定。

zlend :标记压缩列表末尾的特殊值0XFF。 指示压缩列表到此为止。

值得注意的是,此压缩列表的内存空间是连续的。 这也是压缩列表的主要特点,空间连续,避免内存碎片,节约内存。

entry是链表的节点,表示数据。

在redis中,按如下方式定义压缩列表中的节点:

typedefstructzlentry { unsignedintprevrawlensize; /*存储前一个节点长度数值所需的字节数*/unsigned int prevrawlen; /*上一个节点的长度*/unsigned int lensize; /*当前节点长度数值所需的字节数*/unsigned int len; /*当前节点的长度*/unsigned int headersize; /*当前节点头部的大小,值=prevrawlensizelensize.*/unsignedcharencoding; /*编码方式、ZIP_STR_*或ZIP_INT_* */unsigned char *p; /*指向节点内容的指针. */} zlentry; 已定义此结构,但zlentry结构不用作存储压缩列表中数据节点的结构。 因为在此结构中存储小整数或短字符串很浪费空间。 此结构在32位计算机上共占用28字节(32位计算机),在64位计算机上占用32字节。 这不符合压缩列表提高内存利用率的设计目的。 因此,redis定义了一些宏,而不是定义用于操作的结构。 压缩列表中节点的真正结构如下图所示。

记录prev _ entry _ len:http://www.Sina.com/encoding:http://www.Sina.com /的value成员的http://www.Sina.com/value

ziplist特征压缩列表ziplist结构本身是一个连续的内存块,由标题、几个条目节点和压缩列表尾部标识符zlend组成,用于通过一系列编码规则提高内存利用率,存储整数和短字符串压缩列表ziplist结构的缺点是,每次插入或删除一个元素时,都需要频繁地扩展或缩小内存,“移动”数据,从而导致连锁更新,导致严重的效率损失。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。