书籍豆瓣链接:《Redis设计与实现》
开始学习时间:
预计完成时间:
实际完成时间:
数据结构与对象
简单动态字符串sds
1 | 1. 记录字符串长度len,常数时间将获得字符串长度 |
链表list
1 | 双端,prev和next指针 |
字典dictht
hashtable
1 | 槽数量size,掩码sizemask=size-1,used槽使用数量, |
rehash
1 | 时间 |
渐进式rehash
1 | 步骤 |
跳跃表skiplist
表数据结构
1 | head tail |
节点数据结构
1 | level数组 |
整数集合intset
1 | contents 申明为int8数组 |
压缩列表ziplist
表数据结构
1 |
节点数据结构
1 | previous_length 1 or 5字节 |
对象
对象数据结构
1 | type |
字符串对象
1 | int ptr指向long |
列表对象
1 |
对象共享
1 | 初始化服务器,创建0-9999,1万个对象 |
单机数据库
数据库
数据库
1 | redisDb *db 维护一组数据库 select 下标选择 |
键空间
1 | 读写键空间的维护操作 |
过期删除策略
1 | 定时删除:设置键过期时间同时,创建定时器,定时删除 |
过期键处理
1 | RDB |
RDB持久化
1 | BGSAVE派生出一个子进程,然后子进程负责创建RDB文件 |
AOF持久化
AOF持久化步骤
1 | 1. 命令追加 |
AOF载入与数据还原
1 | 创建一个不带网络链接的伪客户端 |
AOF重写步骤
1 | 跟RDB一样,也是使用子进程进程后端AOF重写 |
事件
文件事件
1 | reactor模式,I/O多路复用+单进程,简单,避免上下文切换带来的消耗 |
时间事件
1 | 分为定时事件和周期性事件,redis只是用周期性事件 |
客户端
服务器为连接的客户端保存了client列表
客户端属性
1 | 套接字描述符fd |
客户端创建
1 | 使用connect函数连接到服务器 |
客户端关闭
1 | 客户端进程退出或杀死 |
服务器
命令执行器step4 执行后续操作
1 | if 开启慢查询 检查是否添加慢查询日志 |
命令回复给客户端
1 | 将命令回复保存到客户端输出缓冲区,为客户端套接字关联命令回复处理器 |
TODO 套接字什么时候可写
多机数据库
复制
旧版复制功能:同步和命令传播
1 | 同步 |
新版复制功能:完整重同步,部分重同步
1 | 主从服务器分别维护一个复制偏移量offset |
心跳检测REPLCONF
1 | 从服务器1s一次,向主服务器发送命令: |
哨兵(高可用方案)
故障转移
1 | sentinel是redis的高可用方案 |
网络连接
1 | sentinel与服务器的连接 |
sentinel命令类型
1 | INFO命令 10s一次,通过命令连接向服务器发送INFO命令 |
下线判断
1 | 一定时间内,服务器连续向sentinel返回无效回复,判断为主观下线状态 |
集群(分布式数据库方案)
集群
数据结构
1 | 节点使用clusterNode记录自己状态 |
重定向
1 | MOVED 槽的负责权转移到另一个节点,永久重定向 |
复制和故障转移
1 | 故障检测 |
独立功能
发布与订阅
事务
事务的实现
1 | 事务的阶段 |
WATCH
1 | WATCH是乐观锁,可以在EXEC命令执行之前,监视若干数据库键 |
redis事务的ACID性质
1 | 1. 原子性 Atomic 事务中的多个操作,要么全部都执行,要么一个都不执行 |