阅读心得 LEARNINGS
第一部分:
主要内容:
-
字符串(int len,int free,char[] buf)
对c字符串的封装,’\0’不计入lengh属性
有length数据,O(1)复杂度查询length
有字符串空间检测,自动扩容,防止越界覆盖
通过free字段实现空间预分配,而不是每次都要重新分配内存空间,并提供api在需要的时候释放多余的空间
二进制安全,可以兼容’\0’字符
兼容部分C字符串函数
链表
双向
无环
有表头,表尾指针
有length属性
多态的节点值
字典
结构(1,2用于多态的扩展)
type
privadata
ht[2],常规情况下只是用ht[0],rehash的时候会使用到ht[0]
dictEntry 数组的每一个对象是dictEntry
k,v
next ,hash冲突的时候使用next串联
rehashindex,rehash的状态标记
rehash
h[1]的空间分配
h[0] --rehash--> h[1]
h[1] ----> new Dict
周期性调度渐进式rehash
h[1]的空间分配
设置标记位 rehashIndex = 0
判断标记位,如果是在rehash,则对dict的rud时,顺便rehash到h[1]
当全部rehash完成之后,标记位重新置为-1
跳跃表
- 给有序链表加索引,提升检索速度
整数集合
- 通过encoding字段表面当前存储的整数类型(int_16,int_32,int_64),尽可能的节约内存
压缩列表
对象
字符串对象
哈希对象
列表对象
集合对象
有序集合对象
redisServer
redisDB
dict dict 存放 kv 空间
- SET / GET 等K-V指令操作的是该空间
dict expires 存放带有过期时间的建
过期删除策略
定时器,对CPU不友好
惰性删除,获取的时候判断过期,对内存不友好
定期删除
redis采用惰性删除解惑定期删除
联想:
问题:
第二部分:
主要内容:
多机的主从复制实现
旧版的集群复制
同步
客户端发送sync指令给服务端
服务端生产rdb文件给客户端,并将后续的命令写入缓冲区
rdb传输完成之后,发送缓冲命令
命令传播
缺点:sync同步太重
新版复制(引入部分重同步,断线之后,再次像服务器发起同步请求的时候,进入部分重同步模式)
部分重同步(断线恢复的情况)
主服务器偏移量A,服务器ID
从服务器偏移量B,主服务器ID
主服务器维护偏移量跟1M缓冲区
从服务器提供偏移量B+主服务器ID,如果朱服务器ID变更,则进行完整重同步,若服务器id相同,看看在缓冲区中是否能拿到,可以则执行部分重同步,否则使用完整同步
命令丢失检查
主服务器写向从服务器
从服务器返回ACK偏移量
若偏移量不等于主服务器的偏移量,则主服务器主动重新发送缓冲区中的数据
Sentinel系统,redis高可用的保证
sentinel模式启动redis服务器
sentinel连接主服务器,并自动发现所有的从服务器和其他sentinel
当达到一定数量的sentinel都检测到主服务器下线,则客观认为该服务器下线了
选举领头sentinel
sentinel向所有的检测sential发出选举请求,直至选出领头sentinel
领头sentinel对主服务器下线
从从服务器里筛选出新的主服务器
同步所有从服务器的slave of
联想:
问题: