RocksDB源码-0x10-wal的WriteBatch协议
跟RocksDB源码-0x0C-Version对比起来看,VersionEdit是manifest文件的逻辑协议,WriteBatch是wal文件的逻辑协议。
除了协议本身的信息内容,最大的区别是VersionEdit协议没有协议头,WriteBatch有协议头。
1 为什么叫WriteBatch
在RocksDB源码-0x05-WAL中wal中每一条记录是一个put操作,下面的测试代码看一下批量提交
1 | |
再看一下wal文件可以看到是一条记录对应10个put操作。所谓的WriteBatch就是在wal里面的一条记录可能对应多个put操作,一次put一个kv仅仅是特例,封装出来WriteBatch作为逻辑协议。
2 WriteBatch的核心成员
WriteBatch有且仅有一个成员
1 | |
3 构建WriteBatch
很简单就是把二进制挪到WriteBatch成员里面
1 | |
4 WriteBatch布局
只要是协议,就会有布局
整个布局可以看作两个部分
- 协议头12字节
- seq序号 8字节
- count 4字节 表示当前WriteBatch记录了几个put操作
- 协议体 里面放着put的操作 可能1个可能多个 取决于count
每个put record就是标准的TLV协议,为了压缩空间又有两个形态
- 是默认cf tag+key的length+key+value的length+value
- 不是默认cf tag+cf的id+key的length+key+value的length+value
1 | |
RocksDB源码-0x10-wal的WriteBatch协议
https://bannirui.github.io/2026/02/10/RocksDB/RocksDB源码-0x10-wal的WriteBatch协议/