【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)

优缺点
优点

缺点




















