RocketMQ的Index File
RocketMQ的Index File
Index File由三部分组成:Index Head、Hash Slot、Index Item
Index Item的结构
看完这两个没概念?没事,有个印象就好,重点看下面索引的生成
索引的生成
- 插入一条消息
- 计算出消息key的hashcode
- 根据hashcode%500w,计算出应该放到哪个槽中
- 然后在插入Index Item,并在槽中记录Index Item的位置
假设hash slot只有5个、index item 只有20个,演示一下插入索引的过程
插入key1, 计算出hashcode=5,5%5=0在hashslot的0位置
在index item list中插入一个Index Item
hashslot 0位置指向插入的Index item
插入key2, 计算出hashcode=7,7%5=2在hashslot的0位置
在index item list中插入一个Index Item
hashslot 2位置指向插入的Index item
插入key3, 计算出hashcode=10,10%5=0在hashslot的0位置
此时发生了hash碰撞,它在slot的位置和key1相同,怎么处理?
在index item list中插入一个Index Item
hashslot 0位置指向插入的Index item key3
那key1岂不是变成一个孤岛了?
Index item key3会将它的preIndexNo指向Index item key1,这样index item key3和index item key1形成了一个单向链表
索引查找
假设要查询的key是key1
-
根据key计算出所在hash槽,计算出位置是0
-
根据hash槽的值定位对应的Index item, 定位到key3的index item,它是一个单向链表,key3 -> key1
-
遍历这个链表,定位到key1
-
根据item的pyhoffset,到commitLog中定位到消息
Index Head
-
beginTimestamp:文件中消息的最小存储时间
-
endTimestamp:文件中消息的最大存储时间
-
beginPhyoffset:消息的最小偏移量
-
endphyoffset:消息的最大物理偏移量
-
hashSlotCount:已用 hash 槽个数
-
indexCount:已用 index 个数