【redis】redis经典五大类型源码及其底层实现
文章目录
- 【redis】redis经典五大类型源码及其底层实现
- 前言
- 一、面试题
- 二、在哪找redis的源码?
- 三、SRC下的源码该怎么看?
- 四、KV键值对到底是什么?
- 五、5大结构底层C语言源码分析
- 六、skiplist 入门
前言
一、面试题
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 入门
为什么引出跳表
从原来的简单链表进行优化