在压缩双链表中,节省了前驱和后驱指针的空间,在 64 位机器上共节省了 8 个字节, 这让数据在内存中更为紧 凑。只要清晰的描述每个数据项的边界,就可以轻易得到前驱后 驱数据项的位置,ziplist 就是这么做的。 ziplist 的格式可以表示为:
<zlbytes><zltail><zllen><entry>...<entry><zlend>&oq=<zlbytes><zltail><zllen><entry>...<entry><zlend>
zlbytes 是 ziplist 占用的空间;zltail 是最后一个数据项的偏移位置,这方便逆向遍历链 表,也是双链表的特 性;zllen 是数据项entry 的个数;zlend 就是 255,占 1B。 下面详细展开 entry 的结构。entry 的格式即为典型的 type-lenght-value,即 TLV,表述如下:
<prelen><<encoding + lensize><len>><data>
域 1)是前驱数据项的大小。因为不用描述前驱的数据类型,描述较为简单。 域 2)是此数据项的的类型和数据大小。为了节省空间,redis 预设定了多种长度的字符串 和整数。
zset 由 dict和skiplist构成,dict用来判断是否存在该元素
sadd底层数据结构是intset和dict,全整数则用intset