HBase Block Cache更新/失效机制及读写路径疑问
HBase读写流程疑问解答
你的理解确实有误,HBase的读取优先级并非先查Block Cache再查MemStore,正确的查询顺序是:
- 先查MemStore(内存中的未持久化数据)
- 再查Block Cache(磁盘数据的内存缓存)
- 最后查磁盘上的HFile
所以当你执行Put写入新值Y到MemStore后,读取操作会优先从MemStore获取最新的Y,不会去读取Block Cache里的旧值X,这完全符合HBase保证数据最新的设计逻辑。
关于Block Cache的状态:
Put操作本身不会主动更新或失效Block Cache中的旧值X。MemStore里的Y在flush到HFile之前,Block Cache里的X仍然存在,但因为读取优先级的关系,不会被返回。- 当MemStore中的Y被flush到HFile后,后续如果有读取操作命中这个新的HFile数据块,HBase会把Y加载到Block Cache中;而旧的X缓存块会通过LRU(最近最少使用)策略逐渐被淘汰出Block Cache,不会主动清理。
补充一点:HBase是基于版本的存储系统,每个写入操作都会生成带时间戳的新版本。即使读取时同时从多个来源拿到数据(比如MemStore的Y和Block Cache的X),也会自动返回时间戳最新的那个版本——而MemStore里的Y时间戳肯定比Block Cache里的X新,所以最终结果还是Y。
内容的提问来源于stack exchange,提问作者sachin
相关产品推荐
相关产品推荐

