压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现

当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。

压缩列表是Redis为了节约内存而开发的是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值

ziplist 数据结构

压缩列表节点的构成

每个压缩列表节点可以保存一个字节数组或者一个整数值,其中字节数组可以是以下三种长度的其中一种

长度小于等于63字节的字节数组

长度小于等于16383字节的字节数组

长度小于等于4294967295字节的字节数组

数值则可以是以下六种长度的其中一种

1:  4位长介于0至12之间的无符号整数

2:1字节长的有符号整数

3: 3字节长的有符号整数

4:int16类型整数

5:int32类型整数

6 : int64类型整数

压缩列表的数据结构

previous_entry_length 属性以字节为单位,记录了压缩列表中前一个节点的长度,previous_entry_length属性的长度可以是1字节或者5字节

如果前一节点的长度小于254字节那么previous_entry_length属性的长度为1字节 如果前一节点的长度大于等于254字节previous_entry_length属性的长度为5字节

根据当前节点的地址和previous_entry_length的值来计算出前一个节点的地址

压缩列表的从表尾向表头遍历操作就是使用这一原理实现的,只要我们拥有了一个指向某个节点起始地址的指针,那么通过这个指针以及这个节点的previous_entry_length属性

程序就可以一直向前一个节点回溯,最终到达压缩列表的表头节点。

节点encoding属性记录了节点的content属性所保存数据的类型以及长度

一字节、两字节或者五字节长,值的最高位为00 、01、或者10的是字节数组编码这种编码表示节点的content属性保存着字节数组,数组的长度有编码除去最高两位之后的其他位记录

一字节长 值的最高位以11开头的是整数编码,这种编码表示节点的content属性保存着整数值,整数值的类型和长度有编码除去最高两位之后的其他位记录

节点的content属性负责保存节点的值,节点值可以是一个字节数组或者整数值的类型和长度由encoding决定

连锁更新

连锁更新在最坏情况下需要对压缩列表执行N次空间重分配操作,而每次空间重分配的最坏复杂度为O(n) 连锁更新最坏的时间复杂度O(n*n)

lian

转载于:https://www.cnblogs.com/williamjie/p/9502636.html

redis 底层数据结构 压缩列表 ziplist相关推荐

  1. redis:list的底层实现--压缩列表

    压缩列表是list和hash的底层实现之一.为了节约内存而开发的. 什么时候使用? 1)当list中的只包含少量列表项,每个列表项要么只包含小整数,要么就是长度比较短的字符串. 2)当hash里包含的 ...

  2. redis压缩列表ziplist的连锁扩容

    redis中的压缩列表在插入数据的时候可能存在连锁扩容的情况. 在压缩列表中,节点需要存放上一个节点的长度,当上一个entry节点长度小于254个字节的时候,将会一个字节的大小来存放entry中的数据 ...

  3. Redis底层数据结构简介

    目录 1.Redis存储结构 2.数据结构 2.1.简单动态字符串(SDS) 2.2.1.SDS数据结构 2.2.2.编码 2.2.3.SDS与C字符串对比 2.2.链表(Linkedlist) 2. ...

  4. 02 Redis 底层数据结构

    一.不同数据类型存储结构 Redis底层数据结构一共有 6 种,分别是简单动态字符串.双向链表.压缩列表.哈希表.跳表和整数数组.它们和数据类型的对应关系如下图所示: 1 数组与链表的区别 数组和链表 ...

  5. Redis——底层数据结构原理

    摘要 Redis 发展到现在已经有 9 种数据类型了,其中最基础.最常用的数据类型有 5 种,它们分别是:字符串类型.列表类型.哈希表类型.集合类型.有序集合类型,而在这 5 种数据类型中最常用的是字 ...

  6. Redis底层数据结构详解(一)

    Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...

  7. Redis面试题-Redis底层数据结构

    本文参考 嗨客网 Redis面试题 Redis底层数据结构 Redis 的五大数据类型也称五大数据对象,即分别为 string. list. hash. set 和 zset,但 Redis 并没有直 ...

  8. redis底层数据结构简述

    2019独角兽企业重金招聘Python工程师标准>>> redis的数据库对象有五种,分别是字符串对象(key-value),列表对象(list),哈希对象(hash),集合对象(s ...

  9. 保存到redis的字符串类型出现斜杆_深入浅出Redis:这次从Redis底层数据结构开始...

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

最新文章

  1. 融合机器人技术和神经科学的神经工程未来与挑战
  2. 苹果电脑如何删除软件_软件开发公司误将委托人系统数据删除,责任如何认定?...
  3. python圆的半径计算圆的周长列表_python计算圆周长、面积、球体体积并画出圆
  4. Python之pypmml:pypmml的简介、安装、使用方法之详细攻略
  5. git放弃本地修改,强制覆盖本地文件
  6. UML 类图几种关系的总结
  7. linux c 内存elf,gcc加入linux ELF有什么功能?
  8. 管理感悟:眼高手低到眼高手高
  9. php赛车,php调用接口及三分赛车平台搭建出租编写接口
  10. 【设计模式】迭代器模式
  11. 2022还不错的和平精英画质助手iApp源码+附成品
  12. CentOS 7.9安装bpftrace
  13. Internet时间自动同步,国内可用的时间服务器
  14. 宝石熔炼设备可以融化黄金吗?
  15. STM32 FSMC 16位寻址 地址移位的解读
  16. 笔记本win10 睡眠时会自动唤醒?修复后唤醒缓慢也解决了
  17. 高速AD采集项目JESD204B采集卡详细上板教程
  18. python byte 和 list[int]互转(byte to list,list to byte,byte to int)
  19. ESP8266wifi模块与51单片机通信教程
  20. 眼动数据中瞳孔大小这个数据怎么用?

热门文章

  1. ffmpeg源码实现抽取音频并保存 --C++实现
  2. 在ubuntu上安装samba实现与windows的文件共享
  3. P7 计算机的性能指标
  4. 【CyberSecurityLearning 47】PHP 数组
  5. 清理和删除svn信息
  6. 使用 u-boot 烧写内核——韦东山嵌入式Linux学习笔记10
  7. 都2021年了,不会还有人连深度学习还不了解吧(六)-- Padding篇
  8. STM32开发 -- CRC校验码
  9. 百度地图相关问题总结
  10. CSDN-markdown编辑器使用方法