Redis设计与实现系列-基本数据结构-链表和压缩列表

关于《Redis设计与实现》读书笔记

链表作为一种非常友好的数据结构在很多高级编程语言中都有内置,然而C语言中没有没有链表这种数据结构,在redis中redis自行设计了一套链表数据结构用于存储链式数据,redis中设计了一个双端链表,该链表跟普通链表没什么大的区别这里就不详细描述,本文主要介绍redis中另一种链式数据结构压缩列表。

压缩列表(ziplist)是用一些列特殊的编码构成的内存区域,是redis为了节省内存而设计的,ziplist中每个节点可以保存一个长度受限的字符数组(不以 \0 结尾的 char 数组)或者整数,redis中ziplist结果如下图所示:

area        |<---- ziplist header ---->|<----------- entries ------------->|<-end->|

size          4 bytes  4 bytes  2 bytes    ?        ?        ?        ?     1 byte
            +---------+--------+-------+--------+--------+--------+--------+-------+
component   | zlbytes | zltail | zllen | entry1 | entry2 |  ...   | entryN | zlend |
            +---------+--------+-------+--------+--------+--------+--------+-------+
                                       ^                          ^        ^
address                                |                          |        |
                                ZIPLIST_ENTRY_HEAD                |   ZIPLIST_ENTRY_END
                                                                  |
                                                         ZIPLIST_ENTRY_TAIL

一个 ziplist 可以包含多个节点,每个节点可以划分为以下几个部分:

area        |<------------------- entry -------------------->|

            +------------------+----------+--------+---------+
component   | pre_entry_length | encoding | length | content |
            +------------------+----------+--------+---------+

pre_entry_length:前一个节点的长度,有个这个值就可以直接通过指针计算直接跳到上一个节点。

encoding 和 length:encoding 和 length保存着节点字符串的类型及其长度。

content:content保存着节点的内容,长度和类型由encoding和length决定。

转载于:https://my.oschina.net/wenbo123/blog/1919997

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值