02 Redis 底层数据结构
一、不同数据类型存储结构
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)的时间复杂度在表的两端提供push
和pop
操作。
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 底层数据结构相关推荐
- 保存到redis的字符串类型出现斜杆_深入浅出Redis:这次从Redis底层数据结构开始...
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- redis底层数据结构之跳跃表
redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...
- Redis底层数据结构详解(一)
Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...
- Redis面试题-Redis底层数据结构
本文参考 嗨客网 Redis面试题 Redis底层数据结构 Redis 的五大数据类型也称五大数据对象,即分别为 string. list. hash. set 和 zset,但 Redis 并没有直 ...
- Redis底层数据结构详解
Redis底层数据结构详解 我们知道Redis常用的数据结构有五种,String.List.Hash.Set.ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数 ...
- redis底层数据结构简述
2019独角兽企业重金招聘Python工程师标准>>> redis的数据库对象有五种,分别是字符串对象(key-value),列表对象(list),哈希对象(hash),集合对象(s ...
- Redis底层数据结构介绍
文章目录 前言 1. 哈希表 2. 简单动态字符串 使用SDS的好处 对比C字符串 3. 压缩列表 4. 跳表 5. 整数集合.双向链表 Redis数据类型与底层数据结构对照表 前言 一谈到Redis ...
- Redis——底层数据结构原理
摘要 Redis 发展到现在已经有 9 种数据类型了,其中最基础.最常用的数据类型有 5 种,它们分别是:字符串类型.列表类型.哈希表类型.集合类型.有序集合类型,而在这 5 种数据类型中最常用的是字 ...
- Redis底层数据结构(图文详解)
目录 前言 Redis为什么要使用2个对象?两个对象的好处 redisObject对象解析 String 类型 1.int 整数值实现 2.embstr 3.raw List 类型 1.压缩链表:zi ...
最新文章
- 智慧停车介绍、产业链市场全透析
- 阿里云服务器ecs绑定域名,端口的问题,不用80端口
- 嵌入式Linux C笔试题积累(转)
- 最大熵学习笔记(六)优缺点分析
- 安装并配置ROS环境
- (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析
- 用计算机三级处理文件,【题目】计算机三级题目,献给为计算机三级挣扎的同学们...
- Entity Framework ---初见
- 基于TCP协议的摄像头视频网络传输
- Sequencher_v4.1.4 DNA 序列分析的工业标准软件
- 华为社招嵌入式软件面试_华为社招面试流程分享
- 王者荣耀官网全皮肤超超超清原皮爬取!!!
- 毕业设计大全——毕业设计参考选题(Jsp+Servlet+SSM+SpringBoot)(持续更新)
- (1)【数据隐藏】一起入门隐写吧,宝?word、图像、移动设备、文件压缩数据隐藏
- day17-面向对象作业
- C语言-函数(自定义函数)
- 国企工资1万辞职去1.5万月薪私企,不想“内卷”,过来人:请三思
- 联想异能者z51-70笔记本如何bios设置u盘启动?
- 游戏数值策划经验篇:从多角度解读游戏经验值设计
- 计算机专业和物联网专业课,物联网工程专业课程有哪些