《redis 设计与实现》 part2 单机数据库实现

chapter 9 db
server {
client{}
db{
dict{}
}
}
维护数据:
dict
命中次数||不命中次数
事务:dirty(key)
过期(key):expire字典,删除策略:时间驱动、读时检查
通知(key)
LRU:闲置时间(key)

过期key对持久化的影响
RDB:读写检查&忽略。从服务器:载入,至主服务器del。
AOF:追加del,重写忽略

通知:前置检查:服务器检查权限

chapter 10 RDB
启动时载入(阻塞),优先级低于aof
写RDB:阻塞 || not(阻塞其他RDB写(竟态),阻塞AOF重写(磁盘写))
bgsave配置:&& dirty/time
维护:lastsave
RDB文件:数据快照(阻塞)

chapter 11 AOF
AOF:执行的(修改)命令日志
追加写:server执行完命令——append到buffer——redis事件循环结尾处刷新aof_buffer
buffer刷新配置:always(每个事件循环)、everysecond、no(os)

载入:伪客户端执行命令
AOF重写:与AOF文件无关,设置最简命令达到当前db状态(命令分解:防止过长命令导致buffer溢出)
重写缓冲区+重写开始时db副本=现在db状态
重写——追加重写buffer——覆盖AOF

chapter 12 事件
文件事件:与client的socket通信
设置阻塞时间(必须?)
socket accept、read、write、close就绪——事件——IO多路复用监听事件——事件分发——事件处理器
套接字描述符——监听事件类型——事件处理器

时间事件:链表,维护工作
设置最大阻塞时间
统计时间、内存、db占用
清理过期key
清理失效client
AOF、RDB
主从同步
集群同步
???文件事件实现

13 client
维护客户端属性:
socket描述符:用于连接。(伪客户端:AOF、lua)
flags:client状态:伪客户端、主从复制、monitor、阻塞、阻塞完成、事务、watch监视被修改、buffer溢出、待关闭(完成数据传输后)、client向集群asking、从主ack
强制写入AOF:pubsub消息发放副作用,script load服务器修改副作用
client buffer:输入:query_buffer,输出:定长(array)+变长(list)
time属性:创建时间,最后互动时间

client关闭:
进程退出、网络断开、请求无效、kill、空转timeout(非复制、阻塞、订阅)、回复buffer空间不足(或>配置大小)(软性+硬性)

chapter 14 server

命令请求处理
套接字可读——client输入buffer——分析、检查(前置条件:命令、客户端权限、服务器状态)、执行命令——写回复buffer——后续操作
服务器状态:阻塞拒绝服务、事务队列、监视器
后续操作:慢查询、时长、AOFbuffer、复制传播

serverCron:服务器维护
缓存时间:精度要求低
系统调用:精度要求高
统计:每秒执行命令、内存峰值
拦截sigterm——rdb——关闭
客户端:超时时间、输入缓冲区大小
db管理
持久化操作状态:子进程信号:RDB、AOF覆盖;条件触发持久化;阻塞命令执行;

服务器初始化:读配置——初始化结构——打开监听端口——还原数据库状态——执行事件循环

posted @ 2020-12-07 15:10  qmchao  阅读(45)  评论(0)    收藏  举报