一、不同数据类型存储结构

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

1 数组与链表的区别

数组和链表是所有数据结构的基础,其差别在于数据在内存中分步是连续的,详情请参考:参考1: 数据结构之数组和链表的区别_Jasminexjf的博客-CSDN博客_数组与链表的区别第一题便是数据结构中的数组和链表的区别数组(Array)一、数组特点:所谓数组,就是相同数据类型的元素按一定顺序排列的集合;数组的存储区间是连续的,占用内存比较大,故空间复杂的很大。但数组的二分查找时间复杂度小,都是O(1);数组的特点是:查询简单,增加和删除困难;1.1 在内存中,数组是一块连续的区域1.2 数组需要预留空间 在使用前需要提前申请所占内存的大小,...https://blog.csdn.net/Jasminexjf/article/details/88847127

参考2:redis高性能-存储结构 - 简书前言 Redis作为一款高性能数据库,表现在:它接收到一个键值对操作后, 能以微秒级别的速度找到数据,并快速完成操作。其高性能得奥秘来缘于以下两点: 1 Redis 是内存数...https://www.jianshu.com/p/cbd0584da4b9

数据结构系列之跳表 - 知乎前言文中附代码实现. 在公众号回复 【跳表】 也可以获取哦。 什么是跳表 跳表是一种数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log n),优于普通队列的O(n)。…https://zhuanlan.zhihu.com/p/101143158/

mysql源码调试(一)环境搭建【图文】_archivelog_51CTO博客mysql源码调试(一)环境搭建【图文】,操作系统:windowsserver2012R2VS版本:visiostudio2015community机器配置:4core/4G安装所需包:cmake,bison,boost,activeperl,下面为具体版本cmake-3.15.0-rc3-win64-x64.msiboost_1_59.zip(注意boost版本要与mysql版本对应,会在cmake时有报错提示对应哪个版本)activehttps://blog.51cto.com/liucb/2420225

什么是ziplist

Redis官方对于ziplist的定义是(出自ziplist.c的文件头部注释):

The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. It stores both strings and integer values, where integers are encoded as actual integers instead of a series of characters. It allows push and pop operations on either side of the list in O(1) time.

翻译一下就是说:ziplist是一个经过特殊编码的双向链表,它的设计目标就是为了提高存储效率。ziplist可以用于存储字符串或整数,其中整数是按真正的二进制表示进行编码的,而不是编码成字符串序列。它能以O(1)的时间复杂度在表的两端提供pushpop操作。

ziplist的数据结构定义

ziplist的数据结构组成是本文要讨论的重点。实际上,ziplist还是稍微有点复杂的,它复杂的地方就在于它的数据结构定义。一旦理解了数据结构,它的一些操作也就比较容易理解了。

我们接下来先从总体上介绍一下ziplist的数据结构定义,然后举一个实际的例子,通过例子来解释ziplist的构成。如果你看懂了这一部分,本文的任务就算完成了一大半了。

从宏观上看,ziplist的内存结构如下:

压缩链表存储结构:

各个部分在内存上是前后相邻的,它们分别的含义如下:

  • <zlbytes>: 32bit,表示ziplist占用内存的字节总数(也包括<zlbytes>本身占用的4个字节),在对压缩列表进行重新内存分配,或者计算zllen的位置时使用;
  • <zltail>: 32bit,表示ziplist表中最后一项(entry)的起始偏移量在ziplist中的起始地址有多少字节。<zltail>的存在,使得我们可以很方便地找到最后一项(不用遍历整个ziplist),从而可以在ziplist尾端快速地执行push或pop操作。
  • <zllen>: 16bit, 表示ziplist中数据项(entry)的个数。zllen字段因为只有16bit,所以可以表达的最大值为2^16-1。这里需要特别注意的是,如果ziplist中数据项个数超过了16bit能表达的最大值,ziplist仍然可以来表示。那怎么表示呢?这里做了这样的规定:如果<zllen>小于等于2^16-2(也就是不等于2^16-1),那么<zllen>就表示ziplist中数据项的个数;否则,也就是<zllen>等于16bit全为1的情况,那么<zllen>就不表示数据项个数了,这时候要想知道ziplist中数据项总数,那么必须对ziplist从头到尾遍历各个数据项,才能计数出来。
  • <entry>: 表示真正存放数据的数据项,长度不定。一个数据项(entry)也有它自己的内部结构,这个稍后再解释。
  • <zlend>: ziplist最后1个字节,是一个结束标记,值固定等于255。

上面的定义中还值得注意的一点是:<zlbytes><zltail><zllen>既然占据多个字节,那么在存储的时候就有大端(big endian)和小端(little endian)的区别。ziplist采取的是小端模式来存储,这在下面我们介绍具体例子的时候还会再详细解释。

02 Redis 底层数据结构相关推荐

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

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

  2. redis底层数据结构之跳跃表

    redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...

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

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

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

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

  5. Redis底层数据结构详解

    Redis底层数据结构详解 我们知道Redis常用的数据结构有五种,String.List.Hash.Set.ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数 ...

  6. redis底层数据结构简述

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

  7. Redis底层数据结构介绍

    文章目录 前言 1. 哈希表 2. 简单动态字符串 使用SDS的好处 对比C字符串 3. 压缩列表 4. 跳表 5. 整数集合.双向链表 Redis数据类型与底层数据结构对照表 前言 一谈到Redis ...

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

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

  9. Redis底层数据结构(图文详解)

    目录 前言 Redis为什么要使用2个对象?两个对象的好处 redisObject对象解析 String 类型 1.int 整数值实现 2.embstr 3.raw List 类型 1.压缩链表:zi ...

最新文章

  1. 智慧停车介绍、产业链市场全透析
  2. 阿里云服务器ecs绑定域名,端口的问题,不用80端口
  3. 嵌入式Linux C笔试题积累(转)
  4. 最大熵学习笔记(六)优缺点分析
  5. 安装并配置ROS环境
  6. (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析
  7. 用计算机三级处理文件,【题目】计算机三级题目,献给为计算机三级挣扎的同学们...
  8. Entity Framework ---初见
  9. 基于TCP协议的摄像头视频网络传输
  10. Sequencher_v4.1.4 DNA 序列分析的工业标准软件
  11. 华为社招嵌入式软件面试_华为社招面试流程分享
  12. 王者荣耀官网全皮肤超超超清原皮爬取!!!
  13. 毕业设计大全——毕业设计参考选题(Jsp+Servlet+SSM+SpringBoot)(持续更新)
  14. (1)【数据隐藏】一起入门隐写吧,宝?word、图像、移动设备、文件压缩数据隐藏
  15. day17-面向对象作业
  16. C语言-函数(自定义函数)
  17. 国企工资1万辞职去1.5万月薪私企,不想“内卷”,过来人:请三思
  18. 联想异能者z51-70笔记本如何bios设置u盘启动?
  19. 游戏数值策划经验篇:从多角度解读游戏经验值设计
  20. 计算机专业和物联网专业课,物联网工程专业课程有哪些

热门文章

  1. STM32——SPI通信实验
  2. 文字图片行内垂直居中对齐方法
  3. ssh 获取服务器文件命令,ssh读取服务器文件内容
  4. 微信公众号开发之文本回复(三)
  5. 计算机教学音乐,计算机音乐的教学和应用研究
  6. ORDER: OpenWorld Object Detection on Road Scenes
  7. Linux系统管理----用户权限
  8. 1088: 手机短号 (多实例)C语言
  9. 数据分析师发展前景怎么样?
  10. 积极主动 个人愿景的原则_IT专家的愿景:您个人需要了解的内容