RocketMQ IndexFile ByteBuffer的Hash存储结构
1:Header是一个固定长度的Byte数组,具体数据结构参考IndexHeader实现
2:Slot是一块连续Byte数组用于存储Key/Value存储结构,其中Key是一个hash(key),Value是当前元素是第一个索引(也就是当前索引的序号),存储序号目的是便于检索,后面会详细描述。
3:Index也是一块连续Byte数组,用于存储每一个Index数据单元,一个数据单元具体结构如下:
其中第一个块是hash(key)用于过滤的key的,最重要的是Slot Value部分,Slot Value则存储的是上一个hash(key)相同的Index unit的序号,这样就通过Slot Value将相同hash(key)的所有Value连接了起来。
其中timeDiff也是一个比较重要的字段,timeDiff存储的是一个消息的存储的是时间差值,timeDiff = storeTime - header里面的beginTimestamp(beginTimestamp字段是在IndexFile添加第一个消息索引文件的storeTime,然后就以这个时间为基值,然后使用timeDiff存储便宜,这样就可以计算消息的时间了)。一个消息的时间为:storeTime=header.beginTimestamp (基) + timeDiff(偏移)。