首页 > 数据库 >Redis数据结构一之对象的介绍及各版本对应实现

Redis数据结构一之对象的介绍及各版本对应实现

时间:2023-05-14 22:33:28浏览次数:51  
标签:编码 对象 一之 Redis 列表 数据结构 底层

本文首发于公众号:Hunter后端
原文链接:Redis数据结构一之对象的介绍及各版本对应实现

本篇笔记开始介绍 Redis 数据结构的底层实现。

当我们被问到 Redis 中有什么数据结构,或者说数据类型,我们可能会说有字符串、列表、哈希、集合、有序集合。

其实这几种数据类型在 Redis 中都由对象构成,而且是两个对象,一个键对象,一个值对象。

在这些数据类型中,它们的键都是字符串对象,而值可以是前面说的字符串对象、列表对象、哈希对象、集合对象、有序集合对象中的一种,这个取决于键值对的数据类型。

而在 Redis 中,这些对象都有其更底层的实现方式,也就是说这一篇笔记我们要介绍的,更底层的数据结构,而且不同的 Redis 版本有不一样的数据结构,最基础的数据结构包括简单动态字符串、字典、跳跃表、整数集合等,

接下来我们先介绍一下 Redis 中对象的构成,然后介绍一下不同 Redis 版本中每个对象所使用的的底层数据结构,之后再逐个介绍这些数据结构的实现原理,以下是本篇笔记的目录:

  1. Redis 对象的介绍
  2. 不同版本的 Redis 对象的数据结构

注意:本篇文章的主体框架内容是基于书籍《Redis设计与实现》进行描述的,部分过时内容都基于网上查询的相应资料与最新版本进行了对齐,如有其他疏漏,还望指正。

1、Redis 对象的介绍

举一个例子,当我们设置一个字符串类型的数据:

set msg "hello world"

这样,我们就创建了两个对象,且两个都是字符串对象,因为键值对的 key 和 value 都是字符串。

如果我们创建了一个列表数据,那么 key 是字符串对象,而值 value 是列表对象。

在 Redis 中,每个对象都由一个 redisObject 结构来表示:

typedef struct redisObject{
    //类型
    unsigned type:4;
    
    //编码
    unsigned encoding:4;
    
    //指向底层实现数据结构的指针
    void *ptr
    
    //...
} robj;

type

在上面的结构中,type 指的是这个对象的类型,比如我们创建了一个列表数据,那么这个数据的 key 就是一个字符串对象,由这个结构里的 type 来指定,这个数据的 value 就是一个列表对象,也是由 type 来进行指定区分。

但是,当我们想要知道一条数据的数据类型是字符串、列表、哈希、集合、有序集合的哪一种时,我们常常是需要知道的这条数据的 value 的类型,一般也是指的 value 的类型,因为数据的 key 的类型总是字符串对象。

一条数据的值对象类型的获取我们可以用 TYPE 命令来操作:

TYPE msg

TYPE 类型的值输出就是我们那五种类型:string、list、hash、set、zset

encoding

encoding 指的是这个对象底层数据结构使用的编码。

一个对象在不同的情况下的编码及底层数据结构可能是不一样的,比如对于字符串对象,它的编码包括 int,embstr,raw 这三种,但后两种的底层结构其实都是简单动态字符串(SDS),不过它们的底层使用方式略有不同,这个我们在下一节再介绍。

获取对象的值的编码使用 OBJECT ENCODING 命令:

OBJECT ENCODING msg

ptr

ptr 则是作为指针指向的是对象的底层数据结构地址。

上面这些查看对象底层编码的命令,我们会在介绍完各个底层数据结构之后根据存储的不同数据类型进行使用。

2、不同版本的 Redis 对象的数据结构

Redis 3.2 版本以前

在 Redis 3.2 版本以前,每个对象对应的编码,及底层数据结构如下:

字符串对象

编码(OBJECT ENCODING输出结果) 底层数据结构
int 整数
embstr embstr编码的SDS
raw SDS

列表对象

编码(OBJECT ENCODING输出结果) 底层数据结构
ziplist 压缩列表
linkedlist 双向链表

哈希对象

编码(OBJECT ENCODING输出结果) 底层数据结构
ziplist 压缩列表
hashtable 字典

集合对象

编码(OBJECT ENCODING输出结果) 底层数据结构
intset 整数集合
hashtable 字典

有序集合对象

编码(OBJECT ENCODING输出结果) 底层数据结构
ziplist 压缩列表
skiplist 跳跃表

Redis 3.2 版本

而在 3.2 版本,主要对列表对象的底层实现做了修改,由 quicklist 构成底层实现,quicklist 实际上是 linkedlist 和 ziplist 的混合结构。

列表对象

编码(OBJECT ENCODING输出结果) 底层数据结构
quicklist 快速列表

Redis 5.1 之后版本

在 Redis 5.1 版本,引入了新的数据结构 listpack,6.x 版本作为过渡阶段,并且在 7.0 版本,listpack 已经完全替换了 ziplist,成为了哈希对象、有序集合对象的底层数据结构的原有实现之一,更改如下:

哈希对象

编码(OBJECT ENCODING输出结果) 底层数据结构
listpack listpack
hashtable 字典

有序集合对象

编码(OBJECT ENCODING输出结果) 底层数据结构
listpack listpack
skiplist 跳跃表

而且 quicklist 也变成了 linkedlist 和 listpack 的混合结构

这一篇笔记只是作为一个引子,引入 Redis 中各个数据结构的底层结构,在下一篇笔记中我们将正式逐个介绍各个数据结构的底层实现。

如果想获取更多后端相关文章,可扫码关注阅读:
image

标签:编码,对象,一之,Redis,列表,数据结构,底层
From: https://www.cnblogs.com/hunterxiong/p/17400433.html

相关文章

  • 数据结构与算法之一道题感受算法(算法入门)
    题目:给定N个整数的序列{A1,A2,....An},求函数F(i,j)=Max{Ai+.....Aj }题目要求:这道题的目的是要求给定的一个整数序列中,它所含的连续子序列的最大值,比如现在我有一个整数序列{-3,2,3,-3,1}它的最大子序列很显然是 {2,3}第一种方法蛮力法(强制枚举):我们从第一个整数开始遍历,依......
  • redis 事务
    1.事务概述:1.1什么是事务:指可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞。即:一个队列中,一次性、顺序性、排他性的执行一系列命令。1.2与传统关系型数据库的事务相比redis事务的不同之处:我......
  • 04-面试必会-Redis篇
    01-你们项目中哪里用到了Redis?在我们的项目中很多地方都用到了Redis,Redis在我们的项目中主要有三个作用:使用Redis做热点数据缓存/接口数据缓存使用Redis存储一些业务数据,例如:验证码,用户信息,用户行为数据,数据计算结果,排行榜数据等使用Redis......
  • 个人推荐讲的非常好的数据结构免费[速成 速成 速成]视频了
    适用人群期末突击,二级+期末+考研+学习数据结构打基础,考前复习数据结构,巩固数据结构基础学习步骤:每一章,都会先讲基础,然后下一节就是配套习题讲解,坚持学完全部章即可拿捏期末,同时在课程最后提供一个新的整套题的讲解,进行巩固拔高好评截图:  几个小时就带你过了一边基础,讲了直......
  • 数据结构-二维数组内存结构
    二维数组内存结构  逻辑上是二维的,再分配内存的时候,也是给他分配一维的内存行优先存储 行优先存储,M行N列的b[i][j]的存储地址=基地址+(i*N+j)*sizeof(ElemType)列优先存储 M行N列b[i][j]的存储地址=基地址+(j*M+i)*sizeof(ElemType)......
  • chapter2-R的数据结构
    chapter2-R的数据结构R语言的数据结构分为5种类型:标量,向量,矩阵,列表,数据框向量-c()c()构建成的仅包含数值型、字符型、逻辑型数据的一维数组a<-c(1,2,3,4,5) ###数值型的向量b<-c('one','two','three')  ###字符型数据c<-c(T,F) ##逻辑型数据向量中元素的......
  • es笔记一之es安装与介绍
    本文首发于公众号:Hunter后端原文链接:es笔记一之es安装与介绍首先介绍一下es,全名为Elasticsearch,它定义上不是一种数据库,是一种搜索引擎。我们可以把海量数据都放到es里然后提供搜索操作,但是MySQL也同样可以提供搜索,为什么要用es呢?一个是因为它搜索快,使用倒排索引的方......
  • Redis基础命令汇总,看这篇就够了
    本文首发于公众号:Hunter后端原文链:Redis基础命令汇总,看这篇就够了本篇笔记将汇总Redis基础命令,包括几个常用的通用命令,和各个类型的数据的操作,包括字符串、哈希、列表、集合、有序集合等在内的基本操作。以下是本篇笔记目录:通用命令字符串命令哈希命令列表命令集合命......
  • 数据结构教程之树
    树大家都见过吧当然,我们今天说的不是这个树,而是这个这玩意和大自然中的树有啥关系呢很简单首先,做一个树的简笔画然后,在每条树枝的起点和终点画上圆圈,树枝交会的地方也要画其次,在圆圈间树枝的地方用直线连接随后,把原来的简笔画去掉,整理一下圆圈,凑得太紧的分开一点,太远......
  • redis学习
    目录1.redis常用的命令a>String命令b>Hash命令c>list命令D>Set命令E>Sotedset命令F>对value操作的命令(通用命令)2.redis在java中的连接a>配置commons-pool依赖b>配置yml文件连接redisc>自定义序列化redis的键值3.序列化器改进4.session改为Redisa>session模式b>Redis实现短信登陆(1)......