当前位置: 首页 >  互联网技术 >  Redis数据结构一之对象的介绍及各版本对应实现

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

导读:本文首发于公众号:Hunter后端.原文链接:Redis数据结构一之对象的介绍及各版本对应实现.本篇笔记开始介绍 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 中各个数据结构的底层结构,在下一篇笔记中我们将正式逐个介绍各个数据结构的底层实现。

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

内容
  • 【Oculus Interaction SDK】(一)设置 VR 相机与控制器 & 实现简单的抓取功能
    【Oculus Interact
    2023-12-10
    前言.前段时间 Oculus 的 SDK.频繁更新,很多已有的教程都不再适用于现在的版本了。本系列文章的主要目的是记录现
  • Unity 中的存档系统(本地存档)
    Unity 中的存档系统(本地存
    2023-12-09
    思想.在游戏过程中,玩家的背包、登录、人物系统都与数据息息相关,无论是一开始就设定好的默认数据,还是可以动态存取的数据,
  • 刀光拖尾功能的改良
    刀光拖尾功能的改良
    2023-12-09
    年末终于有空,刀光拖尾是我很早就想回顾的一个课题,项目中多采用插件实现,很少有机会去研究。.之前也写过一版拖尾,但效果并
  • Unity绘制圆和缓动雷达图
    Unity绘制圆和缓动雷达图
    2023-12-08
    Unity绘制圆和缓动雷达图.之前在做UI模块的时候遇到过需要做雷达图的效果,所以简单复习了一下.关于网格绘制.我们都知
  • Unity中基于EPPLUS的Excel转换以及Json数据读取
    Unity中基于EPPLUS的E
    2023-12-08
    摘要:.主要使用Epplus的的表格转换功能,将表格转换成Json,而Unity中Json的使用要搭配对应结构的类,故顺
  • UE5 材质 运动的扭曲效果
    UE5 材质 运动的扭曲效果
    2023-12-06
    前言.本篇使用UE5的材质系统实现运动的扭曲效果,并解决他的重复性.纹理变换.总结思路.为uv坐标添加time节点.实现
  • Mybatis的工作原理
    Mybatis的工作原理
    2023-12-05
    mybatis的工作原理.mybatis基本工作原理.封装sql ->调用JDBC操作数据库 -> 返回数据封装.JDB
  • 暗黑破坏神词缀实现思路2.0
    暗黑破坏神词缀实现思路2.0
    2023-12-05
    代码示例.Github地址:暗黑破坏神词缀实现思路-示例代码.序言.暗黑类游戏非常经典,之前玩过很多,也尝试过写过实现的
  • OnionArch - 采用DDD+CQRS+.Net 7.0实现的洋葱架构
    OnionArch - 采用DD
    2023-12-04
    博主最近失业在家,找工作之余,看了一些关于洋葱(整洁)架构的资料和项目,有感而发,自己动手写了个洋葱架构解决方案,起名叫
  • 数据分析师如何用SQL解决业务问题?
    数据分析师如何用SQL解决业务问
    2023-12-03
    本文来自问答。.提问:数据分析人员需要掌握sql到什么程度?.请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?
  • 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找
    缓存面试解析:穿透、击穿、雪崩,
    2023-12-03
    为什么使用缓存.在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象。通过将经常使用的数据存储在缓
  • 实现草地Shader的物体互动效果
    实现草地Shader的物体互动效
    2023-12-02
    我跟着教程:https://zhuanlan.zhihu.com/p/433385999 用Unity Shader实现
  • 驱动开发:内核LoadLibrary实现DLL注入
    驱动开发:内核LoadLibra
    2023-12-02
    远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建
  • Unity学习笔记--数据持久化Json
    Unity学习笔记--数据持久化
    2023-12-02
    JSON相关.json是国际通用语言,可以跨平台(游戏,软件,网页,不同OS)使用,.json语法较为简单,使用更广泛。
  • ***性能优化和调整服务
    ***性能优化和调整服务
    2023-12-31
    ***性能优化和调整服务.***性能优化和调整服务是指针对服务器的硬件和软件进行调整和优化,以提高其运行效率和稳定性的服
  • 科技创新孵化器服务
    科技创新孵化器服务
    2023-12-16
    科技创新孵化器服务.科技创新孵化器是指为初创科技企业提供办公、技术、**和资金服务的机构,而科技创新孵化器服务则是指这些
  • ***迁移与升级解决方案
    ***迁移与升级解决方案
    2024-01-05
    ***迁移与升级解决方案.随着业务的不断扩大和发展,很多企业逐渐意识到原有的***已经不能满足日益增长的需求,因此需要进
  • 虚拟现实技术开发
    虚拟现实技术开发
    2024-01-15
    虚拟现实技术开发.虚拟现实技术已经成为了当今科技行业的热门话题,它的发展日益迅猛,给人们的生活和工作带来了巨大的变革。在
  • 全球电子元件市场趋势分析
    全球电子元件市场趋势分析
    2023-12-31
    全球电子元件市场趋势分析.近年来,全球电子元件市场呈现出不断增长的趋势。随着科技的不断发展和智能设备的普及,电子元件市场
  • 电子元件质量检测与认证服务
    电子元件质量检测与认证服务
    2024-01-05
    电子元件质量检测与认证服务.为什么需要电子元件质量检测与认证服务?.随着电子产业的不断发展,电子元件在各个生产领域都起着
  • ***虚拟化技术咨询服务
    ***虚拟化技术咨询服务
    2023-12-21
    ***虚拟化技术咨询服务.在当今数字化时代,***虚拟化技术越来越受到企业和个人用户的青睐。虚拟化技术通过将物理***划
  • 高性能电子元件**
    高性能电子元件**
    2024-01-10
    高性能电子元件**.随着科技的不断进步,电子行业的发展日新月异。高性能电子元件作为电子产品的关键组成部分,对于产品的性能
  • 定制化电子元件解决方案
    定制化电子元件解决方案
    2024-01-15
    定制化电子元件解决方案.在现代科技发展迅速的时代,电子元件的需求日益增加,同时对于定制化的需求也在不断提升。定制化电子元
  • ***安全加固与防护方案
    ***安全加固与防护方案
    2024-01-10
    ***安全加固与防护方案.随着互联网的快速发展,***安全问题日益凸显。一旦***遭受攻击,可能导致数据泄露、服务中断甚