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

这篇具有很好参考价值的文章主要介绍了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 中各个数据结构的底层结构,在下一篇笔记中我们将正式逐个介绍各个数据结构的底层实现。

如果想获取更多后端相关文章,可扫码关注阅读:
Redis数据结构一之对象的介绍及各版本对应实现文章来源地址https://www.toymoban.com/news/detail-444354.html

到了这里,关于Redis数据结构一之对象的介绍及各版本对应实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis内部数据结构Dict结构详解

    dict的数据结构定义 dict的创建(dictCreate) dict的查找(dictFind) dict的插入(dictAdd和dictReplace) dict的删除(dictDelete) 如果你使用过Redis,一定会像我一样对它的内部实现产生兴趣。《Redis内部数据结构详解》是我准备写的一个系列,也是我个人对于之前研究Redis的一个阶段性

    2024年01月21日
    浏览(34)
  • Redis五种数据结构底层编码结构

    Redis中的 任意数据类型的键和值都会被封装为一个RedisObject ,也叫做Redis对象,源码如下: 对象头不包含数据就已经占16字节,如果数据存string型,一个string一个对象头比较浪费空间,存大量数据时还是建议使用集合,这样可以共用一个对象头更加节省空间 Redis中会根据存储

    2024年02月11日
    浏览(34)
  • redis核心数据结构

    redis下载地址:Download | Redis linux进入redis目录首先使用make命令进行c++的编译,修改redis.conf文件: 启动退出相关命令: redis五种数据结构图: 1、常用命令 2、应用场景 1)、单值缓存 2)、对象缓存 3)、分布式锁  4)、计数器 5) 、计数器 6) 、分布式系统全局序列号 1、

    2024年02月09日
    浏览(34)
  • redis 数据结构(二)

    整数集合是  Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素,并且元素数量不时,就会使用整数集这个数据结构作为底层实现。 整数集合本质上是一块连续内存空间,它的结构定义如下: 可以看到,保存元素的容器是一个 contents 数组,虽然 contents 被声明为 i

    2024年02月09日
    浏览(33)
  • Redis的数据结构

    Redis是一款高性能的键值存储数据库,支持多种数据结构。在Redis中,数据结构是指在Redis中存储和操作数据的方式。Redis支持的数据结构包括字符串、哈希表、列表、集合和有序集合。 字符串是Redis中最基本的数据结构,可以存储任何类型的数据,包括数字、文本和二进制数

    2024年02月09日
    浏览(35)
  • Redis 数据结构详解

    Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。 Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。 原子操作:最小的操作单位,不能继续拆分。即最小的执行单位,不会被其他命令插入。高并发

    2024年02月05日
    浏览(40)
  • Redis数据结构简介

    对redis来说,所有的key(键)都是字符串。     1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value。   String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。   使用:get 、 set 、 del 、 incr、 decr 等

    2024年02月07日
    浏览(40)
  • Redis常见数据结构

    Redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样 在学习Redis不同数据类型时,我们可以在官网( Redis官网)查看不同的命令: 也可以使用使用help @xxx 命令的方式查看 通用命令是部分数据类型都可以使用的指令,常见的有: KEYS:查看符合模板的所有k

    2024年02月13日
    浏览(37)
  • Redis底层数据结构

    SDS全称是Simple Dynamic String,具有如下显著的特点: 常数复杂度获取字符串长度:C语言获取一个字符串的长度需要遍历整个字符串时间复杂度为O(N),而SDS在属性len中记录了字符串长度,获取字符串长度的时间复杂度为O(1)。 杜绝缓冲区溢出:C字符串在执行拼接字符串时,如果

    2024年02月13日
    浏览(38)
  • Redis - 底层数据结构

    Redis 的底层数据结构主要以下几种: SDS(Simple Dynamic String, 简单动态字符串) ZipList(压缩列表) QuickList(快表) Dict(字典) IntSet(整数集合) ZSkipList(跳跃表) 在 Redis 中,并不会直接使用 C 语言自带的字符串结构作为实际的存储结构,而只是将字符串作为字面量使用,大多数情况使用自

    2023年04月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包