redis中的offset是什么意思
一句话先答:
这里的 offset 就是“字节序号”——主节点每写一条命令,就给这段数据按字节顺序编一个全局递增的号码,repl_backlog 用它来判断“从节点到底缺了哪一段”。
- 为什么用“字节”而不用“命令条数”
- Redis 的复制协议是面向字节流的:
主节点把命令序列化成 RESP 文本(如*3\r\n$3\r\nSET\r\n$1\r\na\r\n$1\r\n1\r\n),再追加到 backlog 缓冲区。 - 每条命令长度不固定,用“条数”无法精确定位;用“字节偏移量”才能任意断点续传。
- 三个 offset 角色
master_repl_offset
主节点当前已写入的字节序号(内存里一个long long计数器)。slave_repl_offset
每个从节点自己上报的序号,表示“我已经复制到这儿了”。repl_backlog_off/repl_backlog_histlen
backlog 缓冲区里最早一条字节序号和总长度,用来计算“从节点要的 offset 是否还在窗口内”。
- 现场举例
假设初始为空,主节点顺序执行:
SET k1 v1 → 占用 30 字节 master_repl_offset = 30
SET k2 v2 → 占用 30 字节 master_repl_offset = 60
SET k3 v3 → 占用 30 字节 master_repl_offset = 90
此时 backlog 保存 [1, 90] 这段字节流。
从节点 A 之前复制到 60,现在网络断了 5 秒,主又写了 30 字节(offset 91‥120)。
从节点重连,发送 PSYNC <replid> 61,主节点检查发现 61 ≥ 1 且 61 < 120 → 还在窗口,直接发 [61, 120] 这段增量即可;
若从节点落后太多,要 offset 10,而 backlog 起始已涨到 50,则返回 +FULLRESYNC,必须全量。
- 运维可见的指标
redis-cli info replication
…
master_repl_offset:1234567
slave0:ip=10.0.0.5,port=6379,state=online,offset=1234560,lag=7
…
master_repl_offset - slave_repl_offset ≈ lag(字节级延迟)
- 一句话总结
offset 就是主节点给复制字节流编的“全局序号”,repl_backlog 靠它精确记录“主写到哪里、从拷到哪里”,从而决定增量续传还是全量重传。
