零散碎片

4.1 client对象
image1

1

Redis 里,每一个 TCP 连接(不管是用户连接、从库连接、发布订阅连接)

都对应一个 client 对象

2

任何一个通过 socket 连接到 Redis 服务器的实体(包括从库、监控程序、甚至主库自己),Redis 都会创建一个 client 结构体来表示它,

即Redis 服务器用 client 对象保存这个 socket 的信息.

3 从库的client中保存一个repl_ack_offset表示已确认的数据偏移量

4.2 replication buffer: 主库准备发送给每一个从库的数据 (与从库一一对应)

  1. 每个从库对应一个 client,而每个 client 都有一个独立的 replication buffer。
  2. 全量复制时的 RDB 文件,增量复制时的写命令流。
  3. 每个从库都要有自己的发送缓冲,避免主库一次写入太快、某个从库同步慢,就会互相干扰。

4.3 replication backlog buffer: 主库唯一,全局且固定大小的逻辑环形缓冲区(一对多从库)

  1. 存储最近一段时间内主库发送给从库的写命令, 为增量复制提供数据来源。

  2. 保存一个master_repl_offset: 主库目前写到哪里

  3. 环形结构:节省移动成本、支持持续写入 || 固定大小:控制内存、应对主从“短暂断线”
    由于环形长度太小经常覆盖掉旧数据:1.扩容 2.增加一个中间从库 3.提升从库复制速度

  4. redis的内存分配库jemalloc

规则 按二次幂上界分配.
好处 可以用位运算更快 && 地址对齐cpu访问更高效, 避免碎片化带来的对齐开销.
缺点 17 字节需求,却拿到了 32 字节块,多出来的 15 字节被浪费掉。这叫内部碎片.