redis底层数据结构之ziplist实现详解
ziplist实现
注意:我使用的版本是6.0.10,不同版本可能略有差别
ziplist又叫做压缩列表,使用一段连续的内存来存储数据的数据结构,redis为了节约内存而开发的,可以节省内存空间,其并不是以某种压缩算法来进行压缩存储数据,而是表示一组连续的内存空间使用
ziplist结构
<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
- zlbytes 32位,4个字节 ziplist总字节数
- zltail 32位,4个字节 压缩列表表尾距离起始位置有多少字节,通过该偏移量,无需遍历整个列表就可以确定表尾节点的地址
- zllen 16位,2个字节 记录压缩列表节点数量,由于是16位,最大值为65535,超过的话需要遍历整个ziplist才可以知道
- entry 存储的各个节点
- zlend 8位,1个字节 表示ziplist结尾的特殊值
entry的结构
<prevlen> <encoding> <entry-data>
- prevlen 上一个节点的长度,可以和当前的地址进行指针运算,找到上一个节点的起始地址
- encoding 内容的编码及长度
- entry-data 字符串类型的值
由于这个特殊的结构构造,所以压缩列表可以很快的从表尾向表头遍历操作
- 根据zltail可以直接获取到表尾节点
- 指针指向表尾节点起始地址的指针,根据prevlen可以直接获取到前一个节点的起始地址的指针
- 一直向前一个节点遍历,一直到头节点
使用ziplist的数据类型
redis中hash、list、zset使用了ziplist结构存储,但是存在了一些条件
hash-max-ziplist-entries 512 hash-max-ziplist-value 64 # -5: max size: 64 Kb <-- not recommended for normal workloads # -4: max size: 32 Kb <-- not recommended # -3: max size: 16 Kb <-- probably not recommended # -2: max size: 8 Kb <-- good # -1: max size: 4 Kb <-- good list-max-ziplist-size -2 zset-max-ziplist-entries 128 zset-max-ziplist-value 64
ziplist会比hash、list、zset中使用的底层结构节省内存,存储越小的数据,使用ziplist来进行数据压缩可以得到更好的压缩率,但是会造成额外的内存碎片率
以上就是redis底层数据结构之ziplist实现详解的详细内容,更多关于redis底层数据结构ziplist的资料请关注脚本之家其它相关文章!
相关文章
详解redis在服务器linux下启动的相关命令(安装和配置)
这篇文章主要介绍了redis在服务器linux下的启动的相关命令(安装和配置),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-08-08
最新评论