Redis设计与实现读书笔记_2020.03.08

阅读心得 LEARNINGS

第一部分:

主要内容:

  1. 数据结构

    1. 字符串(int len,int free,char[] buf)

      1. 对c字符串的封装,’\0’不计入lengh属性

      2. 有length数据,O(1)复杂度查询length

      3. 有字符串空间检测,自动扩容,防止越界覆盖

      4. 通过free字段实现空间预分配,而不是每次都要重新分配内存空间,并提供api在需要的时候释放多余的空间

      5. 二进制安全,可以兼容’\0’字符

      6. 兼容部分C字符串函数

    2. 链表

      1. 双向

      2. 无环

      3. 有表头,表尾指针

      4. 有length属性

      5. 多态的节点值

    3. 字典

      1. 结构(1,2用于多态的扩展)

        1. type

        2. privadata

        3. ht[2],常规情况下只是用ht[0],rehash的时候会使用到ht[0]

          1. dictEntry 数组的每一个对象是dictEntry

            1. k,v

            2. next ,hash冲突的时候使用next串联

        4. rehashindex,rehash的状态标记

      2. rehash

        1. h[1]的空间分配

        2. h[0] --rehash--> h[1]

        3. h[1] ----> new Dict

      3. 周期性调度渐进式rehash

        1. h[1]的空间分配

        2. 设置标记位 rehashIndex = 0

        3. 判断标记位,如果是在rehash,则对dict的rud时,顺便rehash到h[1]

        4. 当全部rehash完成之后,标记位重新置为-1

    4. 跳跃表

      1. 给有序链表加索引,提升检索速度
    5. 整数集合

      1. 通过encoding字段表面当前存储的整数类型(int_16,int_32,int_64),尽可能的节约内存
    6. 压缩列表

    7. 对象

      1. 字符串对象

      2. 哈希对象

      3. 列表对象

      4. 集合对象

      5. 有序集合对象

  2. redisServer

    1. redisDB

      1. dict dict 存放 kv 空间

        1. SET / GET 等K-V指令操作的是该空间
      2. dict expires 存放带有过期时间的建

        1. 过期删除策略

          1. 定时器,对CPU不友好

          2. 惰性删除,获取的时候判断过期,对内存不友好

          3. 定期删除

        2. redis采用惰性删除解惑定期删除

联想:

问题:

第二部分:

主要内容:

  1. 多机的主从复制实现

    1. 旧版的集群复制

      1. 同步

        1. 客户端发送sync指令给服务端

        2. 服务端生产rdb文件给客户端,并将后续的命令写入缓冲区

        3. rdb传输完成之后,发送缓冲命令

      2. 命令传播

      3. 缺点:sync同步太重

    2. 新版复制(引入部分重同步,断线之后,再次像服务器发起同步请求的时候,进入部分重同步模式)

      1. 部分重同步(断线恢复的情况)

        1. 主服务器偏移量A,服务器ID

        2. 从服务器偏移量B,主服务器ID

        3. 主服务器维护偏移量跟1M缓冲区

        4. 从服务器提供偏移量B+主服务器ID,如果朱服务器ID变更,则进行完整重同步,若服务器id相同,看看在缓冲区中是否能拿到,可以则执行部分重同步,否则使用完整同步

      2. 命令丢失检查

        1. 主服务器写向从服务器

        2. 从服务器返回ACK偏移量

        3. 若偏移量不等于主服务器的偏移量,则主服务器主动重新发送缓冲区中的数据

  2. Sentinel系统,redis高可用的保证

    1. sentinel模式启动redis服务器

    2. sentinel连接主服务器,并自动发现所有的从服务器和其他sentinel

    3. 当达到一定数量的sentinel都检测到主服务器下线,则客观认为该服务器下线了

    4. 选举领头sentinel

    5. sentinel向所有的检测sential发出选举请求,直至选出领头sentinel

    6. 领头sentinel对主服务器下线

    7. 从从服务器里筛选出新的主服务器

    8. 同步所有从服务器的slave of

联想:

问题: