标签:str 碎片 了解 lin 引入 它的 命令 遍历 保存
redis有五种基本数据结构:字符串、hash、set、zset、list。但是你知道构成这五种结构的底层数据结构是怎样的吗? 今天我们来花费五分钟的时间了解一下。
这里不得不提动态字符串 SDS,即 ”simple dynamic string" 的缩写。redis 中所有场景中出现的字符串,基本都是由SDS来实现的。
free:还剩多少空间; len:字符串长度; buf:存放的字符数组
为减少修改字符串带来的内存重分配次数,SDS 采用了 “一次管够” 的策略:
为避免缩短字符串时候的内存重分配操作,SDS 在数据减少时,并不立刻释放空间。
其中:embstr 和 raw 都是由 SDS 动态字符串构成的。
唯一区别是:raw 是分配内存的时候,redis object 和 SDS 各分配一块内存,而 embstr 是 redis object 和 raw 在一块儿内存中。
ziplist 称为 压缩列表;linkedlist 称为 双向列表;
在版本3.2之前,Redis 列表list使用两种数据结构作为底层实现:
双向链表linkedlist
linkedlist是标准的双向链表,Node节点包含prev和next指针,可以进行双向遍历;
还保存了 head 和 tail 两个指针,因此,对链表的表头和表尾进行插入的复杂度都为 (1) —— 这是高效实现 LPUSH 、 RPOP、 RPOPLPUSH 等命令的关键。
压缩列表 ziplist
它是为 Redis 节约内存而开发的。
ziplist 是由一系列特殊编码的内存块构成的列表(像内存连续的数组,但每个元素长度不同), 一个 ziplist 可以包含多个节点(entry)。
ziplist 将表中每一项存放在前后连续的地址空间内,每一项因占用的空间不同,而采用变长编码。由于内存是连续分配的,所以遍历速度很快。
redis3.2+ 之 list 的新实现 quickList
Redis 中的列表 list,在版本 3.2 之前,列表底层的编码是ziplist和linkedlist实现的,但是在版本3.2之后,重新引入 quicklist,列表的底层都由 quicklist 实现。
在版本3.2之前,当列表对象中元素的长度比较小或者数量比较少的时候,采用 ziplist 来存储,当列表对象中元素的长度比较大或者数量比较多的时候,则会转而使用双向列表 linkedlist 来存储。
这两种存储方式的优缺点
可以认为quickList,是ziplist和linkedlist二者的结合;quickList将二者的优点结合起来。
quickList是一个ziplist组成的双向链表。每个节点使用ziplist来保存数据。本质上来说,quicklist里面保存着一个一个小的 redisziplist。结构如下:
标签:str 碎片 了解 lin 引入 它的 命令 遍历 保存
原文地址:https://www.cnblogs.com/liang1101/p/12918880.html