面试题答案
一键面试缓存机制架构设计
- 缓存层次:
- 一级缓存:采用进程内缓存,如Guava Cache。它离应用程序最近,访问速度极快,适合存放高频访问且数据量相对较小的热点数据。
- 二级缓存:使用分布式缓存,如Redis。用于存储相对热度稍低但仍需快速访问的数据,能应对大规模集群环境下的缓存需求,且具备高可用性和扩展性。
- 缓存数据结构:
- 对于HBase的行键查询,在缓存中以行键为key,整行数据为value存储,方便快速返回完整数据。
- 若涉及多条件查询,可以使用布隆过滤器(Bloom Filter)来快速判断某个数据是否可能存在于缓存中,减少不必要的HBase查询。
缓存策略
- LRU(最近最少使用)策略:
- 一级缓存采用LRU策略,当缓存空间满时,移除最近最少使用的数据。这能保证热点数据始终留在缓存中。
- 在二级缓存Redis中,也可配置近似LRU淘汰策略,如
volatile - lru
(对设置了过期时间的key使用LRU淘汰)或allkeys - lru
(对所有key使用LRU淘汰)。
- LFU(最不经常使用)策略:
- 对于一些长期稳定访问频率较低但偶尔会有高访问量的数据,可以考虑在二级缓存中结合LFU策略。通过记录每个key的访问频率,淘汰访问频率最低的数据。
缓存更新机制
- 写后更新:
- 当数据在HBase中被更新后,同步更新缓存中的数据。在分布式系统中,通过消息队列(如Kafka)来异步通知缓存更新。HBase的写操作完成后,发送一条包含更新数据相关信息(如行键、列族等)的消息到Kafka,缓存更新服务监听Kafka队列,收到消息后更新相应的缓存数据。
- 读写分离更新:
- 读请求直接从缓存获取数据。写请求先更新HBase,成功后再更新缓存。在更新缓存前,先删除缓存中的旧数据,再插入新数据,以避免脏数据。
缓存与HBase数据一致性保证措施
- 版本号机制:
- 在HBase表中添加一个版本号列族,每次数据更新时,版本号自增。缓存中也记录数据的版本号。当从缓存读取数据时,将缓存中的版本号与HBase中的版本号进行比较。若不一致,则从HBase重新读取数据并更新缓存。
- 缓存失效时间:
- 为缓存数据设置合理的失效时间(TTL)。在失效时间内,缓存数据被认为是有效的。失效时间到期后,下次访问时从HBase重新读取数据并更新缓存,从而保证数据的一致性。
不同读写比例场景下动态调整缓存策略
- 读多写少场景:
- 缓存策略调整:加大缓存容量,特别是二级缓存的容量,以容纳更多的热点数据。优先采用LRU策略,因为读操作频繁,热点数据更有可能是最近使用的。
- 缓存更新机制优化:适当延长缓存失效时间,减少不必要的缓存更新操作,提高缓存命中率。
- 写多读少场景:
- 缓存策略调整:缩小缓存容量,减少缓存维护成本。可采用写后更新策略,并且缩短缓存失效时间,以尽快反映HBase中的数据变化。
- 一致性保证强化:加强版本号机制的监控和检查频率,确保缓存与HBase数据的一致性。可以考虑在每次写操作后,主动触发缓存版本号检查和更新。