Redis 设计与实现

🐠 数据结构与对象

1. 简单动态字符串

  • 结构

    • int len

      • 记录字符串长度
    • int free

      • 记录buf未使用的长度
    • char buf[]

      • 保存字符串
  • O(1) 复杂性获取字符串长度

  • 杜绝缓冲区溢出
  • 减少修改字符串长度时所需的内存重分配次数
  • 二进制安全
  • 兼容部分C字符串函数

2. 链表

  • 结构

    • listNode *head

      • 头指针
    • listNode * tail

      • 尾指针
    • long len

      • 链表节点数量
    • *dup

      • 当前节点复制
    • *free

      • 当前节点释放
    • *match

      • 当前节点对比
  • 用途

    • 列表键

      • list
    • 发布与订阅

    • 慢查询
    • 监视器

3. 字典

  • 结构

    • dictEntry table

      • key

        • 键值
      • val

        • 映射值
      • next

        • 指向下一个hash节点,形成一个字典链表
    • long size

      • 哈希表大小
    • long sizemask

      • 计算索引值
    • long used

      • 哈希表已使用的节点数量
  • hash 算法

    • MurmurHash2
  • hash 冲突

    • 拉链法

4. 跳表

  • 结构

    • zskiplistNode *forward

      • zskiplistNode *backward

        • 后退指针
      • double score

        • 分值
      • robj *obj

        • 成员对象
    • int span

      • 跨度
  • 用途

    • 有序集合

5. 整数集合

  • 结构

    • encoding

      • 编码格式
    • length

      • 集合包含的元素数量
    • contents[]

      • 保存元素的数组
  • 用途

    • 集合
  • 升级操作带来了操作上的灵活,并且尽可能的节约内存

  • 只支持升级,不支持降级

6. 压缩列表

  • 结构

    • zlbyte

      • 记录压缩列表占用内存字节数
    • zltail

      • 记录压缩列表尾节点距离头节点有多少字节
    • zllen

      • 记录包含节点数量
    • entryX

      • 各个节点
    • zlend

      • 特殊值,记录压缩列表的末端
  • 用途

    • 字典

      • set
      • zset
    • 列表键

      • list

7. 对象

  • 类型

    • string
    • list
    • hash
    • set
    • zset

🍮 单机 redis

1. 持久化

  • aof

    • 保存执行的命令
  • rdb

    • 压缩二进制文件

2. 事件

  • 文件事件

    • I/O多路复用进行套接字操作
    • 单线程
  • 时间事件

    • 定时
    • 周期
    • 达到某刻

😀 分布式 redis

1. 主从复制 模式

  • 步骤

    • 1 设置主服务器的地址以及端口
    • 2 建立套接字连接
    • 3 发送 ping
    • 4 身份验证
    • 5 发送端口信息
    • 6 同步
  • 同步

  • 命令传播

2. sentinel 模式

  • 步骤

    • 1 选举主 sentinel
    • 2 服务之间比较本地版本
    • 3 指定 master
    • 4 主从复制

3. cluster 模式

  • key 通过 分片区值取模到不同主机上

🐝 独立功能

1. 排序

2. 消息队列

3. 事务

4. 二进制数组

5. 慢查询日志

Copyright © Sinsy Note 2021            updated 2021-08-10 00:20:51

results matching ""

    No results matching ""