IndexFile 存储具体消息索引的文件,文件的内容结构如图:
索引文件由索引文件头IndexHeader, 槽位Slot和消息的索引内容三部分构成
IndexHeader:索引文件头信息40个字节的数据组成
beginTimestamp 8位long类型,索引文件构建第一个索引的消息落在broker的时间
endTimestamp 8位long类型,索引文件构建最后一个索引消息落broker时间
beginPhyOffset 8位long类型,索引文件构建第一个索引的消息commitLog偏移量
endPhyOffset 8位long类型,索引文件构建最后一个索引消息commitLog偏移量
hashSlotCount 4位int类型,构建索引占用的槽位数(这个值貌似没有具体作用)
indexCount 4位int类型,索引文件中构建的索引个数
槽位slot, 默认每个文件配置的slot个数为500万个,每个slot是4位的int类型数据
计算消息的对应的slotPos=Math.abs(keyHash)%hashSlotNum
消息在IndexFile中的偏移量absSlotPos = IndexHeader.INDEX_HEADER_SIZE + slotPos *HASH_SLOT_SIZE
Slot存储的值为消息个数索引
消息的索引内容是20位定长内容的数据![]
4位int值, 存储的是key的hash值
8位long值 存储的是消息在commitlog的物理偏移量phyOffset
4位int值 存储了当前消息跟索引文件中第一个消息在broker落地的时间差
4位int值 如果存在hash冲突,存储的是上一个消息的索引地址