第 7 章:压缩列表¶
压缩列表的各个部分
![digraph {
label = "\n 图 7-1 压缩列表的各个组成部分";
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend "];
}](_images/graphviz-a802a0572a1740ab16e41a4934a9e32c76ddda87.png)
一个包含三个节点的压缩列表示例。
![digraph {
rankdir = BT;
label = "\n 图 7-2 包含三个节点的压缩列表";
node [shape = record];
ziplist [label = " <zlbytes> zlbytes \n 0x50 | zltail \n 0x3c | zllen \n 0x3 | entry1 | entry2 | <entry3> entry3 | zlend \n 0xFF "];
node [shape = plaintext];
p [label = "p"];
p -> ziplist:zlbytes;
tail [label = "p + 60"];
tail -> ziplist:entry3;
}](_images/graphviz-e1704745851eff19ad69959cd8d6948c9a0fd5a1.png)
一个包含五个节点的压缩列表示例。
![digraph {
label = "\n 图 7-3 包含五个节点的压缩列表";
rankdir = BT;
node [shape = record];
ziplist [label = " <zlbytes> zlbytes \n 0xd2 | zltail \n 0xb3 | zllen \n 0x5 | entry1 | entry2 | entry3 | entry4 | <entry5> entry5 | zlend \n 0xFF "];
node [shape = plaintext];
p [label = "p"];
p -> ziplist:zlbytes;
tail [label = "p + 179"];
tail -> ziplist:entry5;
}](_images/graphviz-69c4ac185295d6d45b02e081aafcc5a7d83fa4d2.png)
压缩列表节点的各个组成部分。
![digraph {
label = "\n 图 7-4 压缩列表节点的各个组成部分";
node [shape = record];
n [label = " previous_entry_length | encoding | content "];
}](_images/graphviz-e09989ce07edb3a2f072458a07e9cc343e8f91d0.png)
压缩列表节点的 previous_entry_length
属性示例。
![digraph {
label = "\n 图 7-5 当前节点的前一节点的长度为 5 字节";
node [shape = record];
n [label = " previous_entry_length \n 0x05 | encoding \n ... | content \n ... "];
}](_images/graphviz-385632c6c1c3082ede9e6d70d506142af4085b32.png)
使用压缩列表节点的 previous_entry_length
属性遍历整个压缩列表的过程。
![digraph {
rankdir = BT;
node [shape = record];
entry1 [label = " zlbytes | zltail | zllen | <e1> entry1 | <e2> entry2 | <e3> entry3 | <e4> entry4 | zlend "];
node [shape = plaintext];
p1 -> entry1:e4;
}](_images/graphviz-15217b2038767b2545711ded8238c71b143c11fc.png)
![digraph {
rankdir = BT;
node [shape = record];
entry2 [label = " zlbytes | zltail | zllen | <e1> entry1 | <e2> entry2 | <e3> entry3 | <e4> entry4 | zlend "];
node [shape = plaintext];
p2 [label = "p2 = p1 - entry4.previous_entry_length"];
p2 -> entry2:e3;
}](_images/graphviz-092b6d5123dd97425e687c9704d559913d5957f2.png)
![digraph {
rankdir = BT;
node [shape = record];
entry3 [label = " zlbytes | zltail | zllen | <e1> entry1 | <e2> entry2 | <e3> entry3 | <e4> entry4 | zlend "];
node [shape = plaintext];
p3 [label = "p3 = p2 - entry3.previous_entry_length"];
p3 -> entry3:e2;
}](_images/graphviz-ebf45a374446b5d685316dde5a36b78ffca5f1fa.png)
![digraph {
label = "\n 图 7-8 一个从表尾向表头遍历的例子";
rankdir = BT;
node [shape = record];
entry4 [label = " zlbytes | zltail | zllen | <e1> entry1 | <e2> entry2 | <e3> entry3 | <e4> entry4 | zlend "];
node [shape = plaintext];
p4 [label = "p4 = p3 - entry2.previous_entry_length"];
p4 -> entry4:e1;
}](_images/graphviz-957b8bf1a8d830eb0381ba4a2b08c692cd47f269.png)
一个保存着 "hello world"
字符串的压缩列表节点示例。
![digraph {
label = "\n 图 7-9 保存着字节数组 \"hello world\" 的节点";
node [shape = record];
entry [label = " previous_entry_length \n ... | encoding \n 00001011 | content \n \"hello world\" "];
}](_images/graphviz-c5fc18e99e983cb079550d2414b7eea7c3522813.png)
一个保存着整数 10086
的压缩列表节点示例。
![digraph {
label = "\n 图 7-10 保存着整数值 10086 的节点";
node [shape = record];
entry [label = " previous_entry_length \n ... | encoding \n 11000000 | content \n 10086 "];
}](_images/graphviz-4af9b411b4d7b3114a745309df8e0b7d153e8227.png)
向压缩列表添加新节点并引发连锁更新的过程。
![digraph {
label = "\n 图 7-11 包含节点 e1 至 eN 的压缩列表";
node [shape = record];
ziplist [label = " zlbytes| zltail | zllen | e1 | e2 | e3 | ... | eN | zlend "];
}](_images/graphviz-ca5eeddb258a3432262e1b6e4f13b1d5dad0b06d.png)
![digraph {
label = "\n 图 7-12 添加新节点到压缩列表";
rankdir = BT;
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | <new> new | e1 | e2 | e3 | ... | eN | zlend "];
p [label = "添加新节点", shape = plaintext];
p -> ziplist:new;
}](_images/graphviz-f66e4aec4b88dccdf505d17a83a1e6223bd24d41.png)
![digraph {
rankdir = BT;
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | <new> new | <e1> e1 | <e2> e2 | <e3> e3 | ... | <en> eN | zlend "];
p [label = "扩展 e1 \n并引发对 e2 的扩展", shape = plaintext];
p -> ziplist:e1;
}](_images/graphviz-7a4c19917bd20eebfe66915ada84e76a994a3fd8.png)
![digraph {
rankdir = BT;
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | <new> new | <e1> e1 | <e2> e2 | <e3> e3 | ... | <en> eN | zlend "];
p [label = "扩展 e2 \n并引发对 e3 的扩展", shape = plaintext];
p -> ziplist:e2;
}](_images/graphviz-a278b3722772bd1e2e5a2208e31c70b4585978b3.png)
![digraph {
rankdir = BT;
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | <new> new | <e1> e1 | <e2> e2 | <e3> e3 | ... | <en> eN | zlend "];
p [label = "扩展 e3 \n并引发对 e4 的扩展", shape = plaintext];
p -> ziplist:e3;
}](_images/graphviz-3172262673026dc2cb2aa8405ec72b5121c5d5cb.png)
![digraph {
rankdir = BT;
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | <new> new | <e1> e1 | <e2> e2 | <e3> e3 | <more> ... | <en> eN | zlend "];
p [label = "一直扩展下去……", shape = plaintext];
p -> ziplist:more;
}](_images/graphviz-bf850f68a222f407411946bbdc4fd300766c733c.png)
![digraph {
label = "\n 图 7-13 连锁更新过程";
rankdir = BT;
node [shape = record];
ziplist [label = " zlbytes | zltail | zllen | <new> new | <e1> e1 | <e2> e2 | <e3> e3 | <e4> e4 | ... | <eN> eN | zlend "];
p [label = "为 eN-1 扩展 eN 的 previous_entry_length 属性 \n 连锁更新到此结束", shape = plaintext];
p -> ziplist:eN;
}](_images/graphviz-ed722bfd909b7cc487ab710e7dd43cd574aa53aa.png)
压缩列表的各个部分
一个包含三个节点的压缩列表示例。
一个包含五个节点的压缩列表示例。
压缩列表节点的各个组成部分。
压缩列表节点的 previous_entry_length
属性示例。
使用压缩列表节点的 previous_entry_length
属性遍历整个压缩列表的过程。
一个保存着 "hello world"
字符串的压缩列表节点示例。
一个保存着整数 10086
的压缩列表节点示例。
向压缩列表添加新节点并引发连锁更新的过程。