(吐血整理)Redis源码思维导图
2025-02-15 18:00:55 0 举报
AI智能生成
Redis面试思维导图,Redis知识点,Redis面试题,Redis思维导图,Redis面试,Redis学习,Redis学习思维导图,Redis源码,Redis设计与实现,Redis实现原理,Redis架构,Redis数据结构
作者其他创作
大纲/内容
单节点
数据库
基础
默认数量:16
通过SELECT命令切换
不支持获取当前客户端的数据库编码
键空间
使用字典实现
过期机制
过期表使用字典实现
使用定期遍历检查的方式清楚过期键
过期键不影响RDB、AOF、主从同步
通知机制
键事件通知
什么命令被什么键执行
键空间通知
什么键被什么命令执行
持久化
RDB
保存
阻塞处理
SAVE
后台处理
BGSAVE
如果开了AOF,则优先使用AOF
载入
启动时自动载入
间隔性保存
配置save选项
满足save中任意一个条件就执行保存
save 900 1表示900秒内执行了至少1次修改才保存
save 100 30表示100秒内至少执行30次修改才保存
AOF
把写命令追加到日志文件中
appendfsync配置
always:最安全也最慢
everysec:中规中矩
no:最快最不安全
AOF文件膨胀
AOF重写
直接根据数据库读取数据然后生成写入命令再写入到日志文件
为了保障效率与安全,会同时在后台维护2个AOF文件
当AOF文件重写完成后会把旧文件用新文件替换
事件
文件事件
套接字事件
底层处理
时间事件
只有一个serverCron
清楚过期键、过期连接
持久化
定期同步
其他
主循环
会用最近的时间事件到达之前的一些时间去监听文件事件,可以在最大程度上避免空等待
客户端
客户端输入缓冲区超过1GB,连接会被关闭
命令和参数使用一个数组表示,下标为0的元素是命令名称
命令表是一个字典,键是命令名称,值是处理函数等等
输出缓冲区有2个:一个固定长度(较短);一个不固定长度
客户端发送不符合协议格式的文本,或者输入输出缓冲区太大,连接会被关闭
服务端
命令执行后,需要添加慢查询日志、AOF持久化、更新属性、主从同步等
serverCron
很多低精度要求的命令需要获取系统时间,会产生大量的系统调用。serverCron会周期性地缓存系统时间
高精度要求的命令需要系统时间则直接调用操作系统获取
需要处理SIGTERM信号产生的shutdown_asap标识的变更事件(关闭服务器)
服务器启动
系统初始化
加载配置文件
初始化数据结构
执行事件循环
多节点
主从复制
使用过SLAVEOF命令追随一个主服务器
2.8版本之前的SYNC命令和主从复制机制效率极低,建议升级到2.8版本以上
PSYNC
作用
从服务器断开后会部分同步主服务器
部分同步的大小取决于挤压缓冲区的大小
建议设置成:2*断开重连时间*每秒写命令的数据量
构成
主服务器运行ID
同步前需要确认上一次主服务器ID和该命令的参数是否一致
主服务器复制挤压缓冲区
参数中的偏移量在挤压缓冲区中可以部分同步
主服务器复制偏移量
心跳机制
默认每秒向主服务器发送心跳
参数中带有偏移量
作用
实现数据高可用
配置规则:如果从服务器延迟都大于某个值,则可以拒绝写入
检测命令是否丢失
偏移量与主服务器不一致时,主服务器会自动发送补全命令
Sentinel(哨兵)模式
Redis高可用性解决方案
Sentinel模式下启动的redis服务器,本身为特殊模式
本身具有高可用性,多个Sentinel实例可以同时监控一个主服务器
Sentinel节点监控到主服务器下线时,仅仅是主观下线,会再去询问别的Sentinel节点。如果有多个Sentinel节点都标记主节点为主观下线,则认为是客观下线
首先发现客观下线的Sentinel节点,会要求别的Sentinel节点把自己设置为酋长,然后执行故障转移任务——Raft算法
故障转移机制
挑选一个良好的从服务器变成新的主服务器
命令其他服务器跟随这台新的主服务器
当监控到旧的服务器重新上线时,命令其跟随新的主服务器
集群模式(推荐)
节点
节点内消息共享,每个节点持有一份共享消息
类型
主节点
哈希槽指派(高扩展性)
客户端请求时出现的2种错误
move
该键不在本节点中,请重定向到节点xxx
ask
该键已经迁移到xxx,请重定向到xxx
如果需要在迁移后的目标节点访问指定键,请先发送ASKING命令(一次性)
从节点(高可用性)
复制指定的主节点,算法和主从模式一致
故障
检测
节点会定时ping其他的节点
半数以上的节点认为某节点疑似下线,则最后一个认为疑似下线的节点会通知其他节点将疑似下线的节点标记为确定下线
处理
下线的节点的从节点通过Raft选举算法成为新的主节点
然后类似哨兵模式进行处理
Redis对象
结构
type
string
list
hash
set
zset
encoding
SDS
含义:简单动态字符串
结构
len
free
buf
特点
存储字节数组
以”\0“结尾
兼容部分C语言字符串函数
内存策略
预分配内存
惰性回收内存
链表
结构
len
head
tail
各种函数指针
特点
双向
持有len
压缩列表
为节约内存而开发的顺序型数据结构
每个节点保存一个整数或字节集
增加或删除节点可能引起连锁更新,但影响不大
字典
同时含有2个哈希表
渐进式rehash
将rehash操作分摊到对该字典的每次操作中
rehash过程中如果在h0找不到,则会在h1找
负载因子
含义:节点数/表大小
小于1时进行rehash缩减
大于等于1时进行rehash扩容
跳跃表
性能类似于二叉树
不存在重复值
整数集合
不存在重复值
查找性能为O(1)
添加删除性能为O(2)
升级机制更节省内存
ptr
含义:指向具体数据结构的指针
refcount
引用计数
对象共享
引用数为0时被回收
lru
最后一次被命令访问的时间
可以使用OBJECT IDLETIME命令获得空转时间
如果配置了maxmemory选项,则会在内存达到设置的数值时优先释放空转时间更长的对象
类型与编码的关系
REDIS_STRING
REDIS_ENCODING_INT
使用整数值实现的字符串对象
REDIS_ENCODING_EMBSTR
使用embstr编码的简单动态字符串实现的字符串对象
REDIS_ENCODING_RAW
使用简单动态字符串实现的字符串对象
REDIS_LIST
REDIS_ENCODING_ZIPLIST
使用压缩列表实现的列表对象
REDIS_ENCODING_LINKEDLIST
使用双端链表实现的列表对象
REDIS_HASH
REDIS_ENCODING_ZIPLIST
使用压缩列表实现的哈希对象
REDIS_ENCODING_HT
使用字典实现的哈希对象
REDIS_SET
REDIS _NCODING_INTSET
使用整数集合实现的集合对象
REDIS _NCODING_HT
使用字典实现的集合对象
REDIS_ZSET
REDIS_ENCODING_ZIPLIST
使用压缩列表实现的有序集合对象
REDIS_ENCODING_SKIPLIST
使用跳跃表和字典实现的有序集合对象
题
题
独立功能实现
订阅
在服务器维护一个订阅表
可以实现简单的聊天系统
事务
每个客户端实体拥有一个事务丢列和脏标记
使用WATCH命令监视一个键。如果键被写入,写完后顺带把所有监视这个键的客户端的脏标记设置为true
EXEC会把命令当成院子执行,不会切换客户端上下文
脏标记为true时,拒绝执行事务
为了实现简单,Redis事务不支持回滚
排序
先执行SORT命令
ALPHA:以字母顺序为权重
BY:以元素值和BY后面的参数进行拼接成键再取出的值为权重
ASC | DESC:升序或降序
然后执行LIMIT
限制、跳过元素数
然后执行GET
根据元素值和GET后面的参数进行拼接成键再取值
然后执行STORE
保存排序结果到一个键
0 条评论
下一页