【redis】redis经典五大类型源码及其底层实现

news2024/10/6 16:23:52

【redis】redis经典五大类型源码及其底层实现


文章目录

  • 【redis】redis经典五大类型源码及其底层实现
  • 前言
  • 一、面试题
    • redis数据类型的底层数据结构
    • 阅读源码的意义
  • 二、在哪找redis的源码?
  • 三、SRC下的源码该怎么看?
    • 1、redis基本的数据结构(骨架)
      • GitHub官网说明
    • redis数据库的实现
    • redis服务端和客户端的实现
    • 其他
  • 四、KV键值对到底是什么?
    • 1、怎样实现键值对(key-value)数据库的?
    • 2、十大数据类型(粗分)
      • ==传统的5大类型==
      • 新介绍的5大类型
    • 3、
      • 字典、KV是什么(重点)
      • redisObject + redis数据类型 + 所有编码方式(底层实现)三者之间的关系
  • 五、5大结构底层C语言源码分析
    • 1、重点:redis数据类型与数据结构总纲图
      • 源码分析总体数据结构大纲
      • redis6.0老版本
      • 21年11月份后的redis7新版本
      • redis7新特性说明(回顾第一章的笔记)
    • 2、源码分析总体数据结构大纲
    • 3、从set hello world说起
    • 4、redisObject结构的作用
      • 是什么?:相当于string、hash、set、zset、list的父类
      • redisObject各字段的含义 物理编码底层有三种 embstr int raw
      • 案例 在控制台中set age 17
    • 5、`经典5大数据结构解析`
      • 各个类型的数据结构和编码映射和定义 在object.c下
      • Debug Object key
      • a、string数据结构介绍
        • 3大物理编码方式
          • C语言中字符串展示
          • SDS简单动态字符串
          • reds为什么重新设计一个SDS数据结构?
          • 源码分析
            • 调用关系
            • 3大物理编码方式 int embstr raw 建议看原片,阳哥讲一遍就懂了 P151,或者看案例结论
          • 三大物理编码判断流程图
          • 案例结论
        • 总结:三种物理编码自适应调整,用户不用管
      • b、hash介绍
        • 两种编码方式
        • redis6
          • 案例:
          • 结构 有两个值在conf文件中,个数和长度
          • 结论 能升级,但是不能降级
          • 流程图
          • 源码分析 t听得有点懵
        • redis7
        • ziplist和listpack的内存布局 对比
      • c、List介绍 底层quicklist
        • redis6 = ziplist + LinkedList
          • redis6 案例:
          • redis6 版本前的List的一种编码格式 存储双端链表的quicklist:
          • quicklist总纲
          • redis6 源码分析
            • quicklist结构
            • quicklistNode结构
          • redis6 quicklist里其实就包含了LinkedList和ZipList
        • redis7 = listpack + LinkedList
          • 案例 ziplist被listpack代替
          • redis7 的List一种编码格式
      • d、Set介绍 = intset + hashtable
        • 案例
      • e、ZSet介绍
        • redis6 案例
        • redis7 案例
        • ZSet的两种编码格式
    • 6、小总结
      • redis6 类型-物理编码 对应表
      • redis6数据类型对应的底层数据结构
      • redis6 数据类型以及数据结构的关系
      • redis7 数据类型以及数据结构的关系
      • redis 数据类型以及数据结构的时间复杂度
  • 六、skiplist 入门
    • 为什么引出跳表
    • 是什么 是可以实现二分查找的有序链表
      • `跳表 = 链表 + 多级索引`
    • 时间空间复杂度
      • 时间复杂度 O(logN)
      • 空间复杂度 O(N)
    • 优缺点
      • 优点
      • 缺点


前言

在这里插入图片描述


一、面试题

在这里插入图片描述
在这里插入图片描述

redis数据类型的底层数据结构

阅读源码的意义

】


二、在哪找redis的源码?

压缩包根路径下的src文件夹下
在这里插入图片描述


三、SRC下的源码该怎么看?

在这里插入图片描述

1、redis基本的数据结构(骨架)

GitHub官网说明

在这里插入图片描述

在这里插入图片描述

redis数据库的实现

在这里插入图片描述

redis服务端和客户端的实现

在这里插入图片描述

其他

在这里插入图片描述


四、KV键值对到底是什么?

在这里插入图片描述

在这里插入图片描述

1、怎样实现键值对(key-value)数据库的?

key一般是string类型,value可以是字符串、集合如List对象、Hash对象、SetZset对象等
在这里插入图片描述
图说
在这里插入图片描述

2、十大数据类型(粗分)

在这里插入图片描述

传统的5大类型

在这里插入图片描述

新介绍的5大类型

第一个应该为bitmap
在这里插入图片描述
在这里插入图片描述

3、

在这里插入图片描述

字典、KV是什么(重点)

在这里插入图片描述

源码位置
在这里插入图片描述
在这里插入图片描述

redisObject + redis数据类型 + 所有编码方式(底层实现)三者之间的关系

在这里插入图片描述

在这里插入图片描述


五、5大结构底层C语言源码分析

在这里插入图片描述

1、重点:redis数据类型与数据结构总纲图

在这里插入图片描述

源码分析总体数据结构大纲

在这里插入图片描述

redis6.0老版本

在这里插入图片描述
在这里插入图片描述

21年11月份后的redis7新版本

在这里插入图片描述
在这里插入图片描述

redis7新特性说明(回顾第一章的笔记)

在这里插入图片描述

2、源码分析总体数据结构大纲

redisObject操作底层定义来自哪里?
在这里插入图片描述
在这里插入图片描述

3、从set hello world说起

在这里插入图片描述

在这里插入图片描述

4、redisObject结构的作用

在这里插入图片描述

是什么?:相当于string、hash、set、zset、list的父类

在这里插入图片描述

redisObject各字段的含义 物理编码底层有三种 embstr int raw

在这里插入图片描述在这里插入图片描述

案例 在控制台中set age 17

在这里插入图片描述
在这里插入图片描述

5、经典5大数据结构解析

在这里插入图片描述

各个类型的数据结构和编码映射和定义 在object.c下

在这里插入图片描述

Debug Object key

在这里插入图片描述
命令:Debug Object key 不应该在命令行客户端使用,如果需要使用,则需要去conf文件中修改为‘local’
在这里插入图片描述
开启后:
在这里插入图片描述
不断变化的时间戳和空闲时间,来记录每个KV键值对的信息,以方便redis进行管理
在这里插入图片描述

a、string数据结构介绍

在这里插入图片描述

3大物理编码方式

在这里插入图片描述
int :能存储8个字节的有符号整数(- 2^63 到 2^63-1 ) 数字最多19位
在这里插入图片描述
embstr:嵌入式字符串 长度大于等于20
在这里插入图片描述

raw: 长度大于等于44
在这里插入图片描述

C语言中字符串展示

在这里插入图片描述
在这里插入图片描述

SDS简单动态字符串

sds.c源码
在这里插入图片描述
说明:
在这里插入图片描述
在这里插入图片描述

reds为什么重新设计一个SDS数据结构?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

源码分析

在这里插入图片描述

调用关系

在这里插入图片描述

3大物理编码方式 int embstr raw 建议看原片,阳哥讲一遍就懂了 P151,或者看案例结论

在这里插入图片描述

明明没有超过44位,为什么变成了raw?
在这里插入图片描述

三大物理编码判断流程图

在这里插入图片描述

案例结论

在这里插入图片描述
在这里插入图片描述

总结:三种物理编码自适应调整,用户不用管

在这里插入图片描述

b、hash介绍

在这里插入图片描述

两种编码方式

在这里插入图片描述
案例

redis6

在这里插入图片描述

案例:

在这里插入图片描述
在这里插入图片描述

结构 有两个值在conf文件中,个数和长度

在这里插入图片描述

结论 能升级,但是不能降级

在这里插入图片描述

流程图

在这里插入图片描述

源码分析 t听得有点懵

t_hash.c
在这里插入图片描述
在这里插入图片描述
ziplist.c 时间换空间
在这里插入图片描述
是什么?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
组成ziplist的各个单元是什么意思
在这里插入图片描述

P155 功力不够。。。听得蒙圈放弃了

redis7

在这里插入图片描述
案例:
在这里插入图片描述
结构:
在这里插入图片描述
结论;
在这里插入图片描述
流程图:
在这里插入图片描述

ziplist和listpack的内存布局 对比

在这里插入图片描述
listpack解决了ziplist的连锁更新问题 节点前段更新,后段整体后移,浪费性能
在这里插入图片描述

c、List介绍 底层quicklist

在这里插入图片描述

redis6 = ziplist + LinkedList

redis6 案例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

redis6 版本前的List的一种编码格式 存储双端链表的quicklist:

在这里插入图片描述
在这里插入图片描述

quicklist总纲

在这里插入图片描述
在这里插入图片描述

redis6 源码分析

在这里插入图片描述

quicklist结构

在这里插入图片描述

quicklistNode结构

在这里插入图片描述

redis6 quicklist里其实就包含了LinkedList和ZipList

在这里插入图片描述

redis7 = listpack + LinkedList

案例 ziplist被listpack代替

第二个参数是 压缩深度
在这里插入图片描述

redis7 的List一种编码格式

在这里插入图片描述

d、Set介绍 = intset + hashtable

在这里插入图片描述

案例

在这里插入图片描述

e、ZSet介绍

在这里插入图片描述

redis6 案例

在这里插入图片描述

redis7 案例

在这里插入图片描述

ZSet的两种编码格式

在这里插入图片描述

6、小总结

底层:
在这里插入图片描述

redis6 类型-物理编码 对应表

在这里插入图片描述
在这里插入图片描述

redis6数据类型对应的底层数据结构

在这里插入图片描述
在这里插入图片描述

redis6 数据类型以及数据结构的关系

在这里插入图片描述

redis7 数据类型以及数据结构的关系

在这里插入图片描述

redis 数据类型以及数据结构的时间复杂度

在这里插入图片描述


六、skiplist 入门

在这里插入图片描述

为什么引出跳表

从原来的简单链表进行优化
在这里插入图片描述

是什么 是可以实现二分查找的有序链表

在这里插入图片描述

跳表 = 链表 + 多级索引

时间空间复杂度

时间复杂度 O(logN)

在这里插入图片描述

空间复杂度 O(N)

在这里插入图片描述

优缺点

优点

在这里插入图片描述

缺点

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路径规划算法:基于樽海鞘算法的路径规划算法- 附代码

路径规划算法:基于樽海鞘优化的路径规划算法- 附代码 文章目录 路径规划算法:基于樽海鞘优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

桂院校园导航小程序 静态项目 二次开发教程 1.0.1

Gitee代码仓库:桂院校园导航小程序 GitHub代码仓库:GLU-Guide 先 假装 大伙都成功安装了静态项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了,有提到 我的学校 …

现代软件测试中的自动化测试工具

自动化测试的重要性和优势 引言:随着软件开发的不断发展,自动化测试工具在现代软件测试中扮演着重要角色。提高效率:自动化测试可以加快测试流程,减少人工测试所需的时间和资源。提升准确性:自动化测试工具可以减少人…

python3 爬虫相关学习3:requests.get(url)的各种属性

目录 1 requests.get(url) 的各种属性 1.1 response.text 1 requests.get(url) 的各种属性,也就是response的各种属性 接触的requests模块的常用功能:一般把 response requests.get(url) requests.get(url)的各种属性 print(response.text)print(…

Flink Watermark 源码分析

随着 flink 的快速发展与 API 的迭代导致新老版本差别巨大遂重拾 flink,在回顾到时间语义时对 watermark 有了不一样的理解。 一、如何生成 在 flink 1.12(第一次学习的版本)时 watermark 生成策略还有两种: punctuated 和 periodic,在 1.17 中 punctua…

基于自建靶场三层网络的内网渗透

注意:一切内容仅用于安全技术的分享,切勿用于其他用途,产生严重的后果与作者无关 前言介绍: 网络拓扑图: 为了方便起见,我在每个服务器放有webshell,这里主要是让我们熟悉sock代理的使用。 这…

修剪二叉搜索树

1题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当…

10 常见网站安全攻击手段及防御方法

在某种程度上,互联网上的每个网站都容易遭受安全攻击。从人为失误到网络罪犯团伙发起的复杂攻击均在威胁范围之内。 网络攻击者最主要的动机是求财。无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的风险就在那里。 知己知彼百战不殆&…

【一起撸个深度学习框架】6 折与曲的相会——激活函数

CSDN个人主页:清风莫追欢迎关注本专栏:《一起撸个DL框架》GitHub获取源码:https://github.com/flying-forever/OurDLblibli视频合集:https://space.bilibili.com/3493285974772098/channel/series 文章目录 6 折与曲的相会——激活…

史蒂夫·青木主题的 Game Jam

准备好潜入史蒂夫青木的脑海中,创造一个探索他内心思想的游戏吧!史蒂夫青木主题 Game Jam 正式推出,这是一场为期两周的游戏制作比赛,鼓励参赛者创造和史蒂夫青木内心世界有关的游戏。 探索这位传奇艺术家和 DJ 潜意识&#xff0c…

nginx压测记录

nginx压测记录 1 概述2 原理3 环境3.1 设备与部署3.2 nginx配置/服务器配置 4 netty服务5 步骤6 结果7 写在最后 1 概述 都说nginx的负载均衡能力很强,最近出于好奇对nginx的实际并发能力进行了简单的测试,主要测试了TCP/IP层的长链接负载均衡 2 原理 …

Python 与数据科学实验(Exp9)

实验9 多分类手写数字识别实验 1.实验数据 (1)训练集 所给数据一共有42000张灰度图像(分辨率为28*28),目前以train_data.csv文件给出. 图像内容涵盖了10个手写数字0-9。 图像示例如图所示: train_data.…

算法(一)—— 回溯(4)困难题

文章目录 1 37 解数独2 51 N 皇后 1 37 解数独 首先明确需要两个for循环,这样才可以遍历整个9*9的表。 此题数字的选取逻辑再次展现了回溯的暴力性。 此题需要拥有返回值,与数据结构(六)—— 二叉树(5)中…

物联网和云计算:如何将设备数据和云端服务相结合

第一章:引言 物联网和云计算是当今IT领域中的两个重要概念,它们的结合为企业和个人带来了巨大的机遇和挑战。物联网通过连接各种设备和传感器,实现了设备之间的互联互通,而云计算则提供了强大的计算和存储能力。本文将深入探讨如何…

MySQL学习(基础篇1.0)

MySQL概述(基础) SQL 全称Structured Query Language,结构化察浑语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。 SQL通用语法 SQL语言的统统用语法: SQL语句可以单行或多行书写,以分号…

论文阅读|基于图神经网络的配电网故障定位方法

来源:北京交通大学硕士学位论文,2022 摘要 电网拓扑形态多样,重构场景频繁,,传统故障定位方法的单一阈值设定无法满足要求,基于人工智能的配电网故障定位技术具有很大的应用潜力,但仍存在着拓…

HTML概述及常用语法

什么是 HTML HTML 用来描述网页的一种语言 HTML -- hyper text markup language 超文本标记语言 超文本包括&#xff1a;文字、图片、音频、视频、动画等等 标记语言&#xff1a;是一套标记标签&#xff0c; HTML 使用标记标签来 描述 网页 <> HTML 发展史 HTML5 …

Web基础 ( 二 ) CSS

2.CSS 2.1.概念与基础 2.1.1.什么是CSS Cascading Style Sheets 全称层叠样式单 简称样式表。 是告诉浏览器如何来显示HTML的元素的特殊标记 2.1.2.编写方式 2.1.2.1.外部文件 在html文件的<head>中加入<link>结点来引入外部的文件 <link rel"stylesh…

Go Wails Docker图形界面管理工具 (5)

文章目录 1. 前言2. 效果图3. 代码 1. 前言 接上篇&#xff0c;本次添加Docker存储卷功能 待优化: 优化分页效果添加存储卷大小查看功能 2. 效果图 3. 代码 直接调用官方库 app.go func (a *App) VolumeList() ([]*volume.Volume, error) {resp, err : Cli.VolumeList(context…

Linux中关于时间修改的命令

目录 Linux中关于时间修改的命令 data命令 语法格式 示例 date命令中的参数以及作用 常用格式示例 timedatectl命令 语法格式 timedatectl 命令中的参数以及作用 常用格式 Linux中关于时间修改的命令 data命令 data --- 用于显示或设置系统的时间与日期 用户只需在强…