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

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


文章目录


前言

在这里插入图片描述


一、面试题

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

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)

在这里插入图片描述

优缺点

优点

在这里插入图片描述

缺点

在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值