【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 入门
为什么引出跳表
从原来的简单链表进行优化