面试题答案
一键面试缓存机制
- 选择合适的缓存类型:
- 全量聚合结果缓存:对于一些固定维度组合且查询频繁的聚合查询,例如按品牌和销量区间的月销量聚合,缓存完整的聚合结果。可以使用Redis等分布式缓存,利用其高读写性能,将聚合结果以JSON或序列化后的格式存储。
- 部分聚合结果缓存:当聚合维度较多时,缓存中间聚合结果。比如先按品牌聚合销量,再根据价格区间进一步筛选。先缓存按品牌聚合的销量数据,后续查询可基于此缓存数据再按价格区间过滤,减少重复计算。
- 缓存更新策略:
- 写后更新:在商品数据发生变化(如价格修改、销量增加)后,异步更新缓存。例如使用消息队列(如Kafka)接收数据变化消息,由消费者异步更新相关的缓存聚合结果。这样可以避免在数据更新时阻塞业务流程,但可能会导致短时间内缓存与数据库不一致。
- 失效策略:设置合理的缓存过期时间,对于变化频繁的数据,如实时销量,设置较短的过期时间;对于相对稳定的数据,如品牌信息,设置较长的过期时间。同时,结合缓存预热机制,在系统启动或缓存过期时,提前加载常用的聚合数据到缓存中。
索引优化策略
- 多维度索引:
- 复合索引:针对常用的聚合维度组合创建复合索引。例如,若经常按品牌、价格区间和销量进行聚合查询,创建包含品牌、价格字段(如价格下限和上限)、销量字段的复合索引。复合索引的字段顺序应遵循最左前缀原则,按照查询中最常使用的维度顺序排列。
- 倒排索引:对于文本类型的品牌字段,如果有模糊查询需求,可考虑建立倒排索引。倒排索引可以快速定位包含特定关键词的品牌,提高查询效率。
- 索引维护:
- 定期重建索引:随着商品数据的不断增删改,索引可能会出现碎片化,影响查询性能。定期(如每月或每季度)对数据库索引进行重建或优化操作,以提高索引的效率。
- 动态调整索引:根据实际查询日志和业务需求变化,动态添加或删除索引。如果发现某个索引长时间未被使用,可考虑删除以减少存储开销和写入性能损耗;如果新出现频繁的复杂聚合查询,及时创建相应的索引。