面试题答案
一键面试缓存方案设计
1. 缓存分层
- 一级缓存(应用内缓存):采用LRU(Least Recently Used)算法。用于存储最热门且更新频繁的商品数据。因为LRU算法会优先淘汰最近最少使用的数据,对于热门商品,它们经常被访问,不容易被淘汰,能保证较高的缓存命中率。此缓存位于应用服务器内存中,访问速度极快,可快速响应高频请求。
- 二级缓存(分布式缓存):使用LFU(Least Frequently Used)算法。针对更新相对较少的大部分商品数据。LFU算法根据数据的访问频率来淘汰数据,这类商品虽然不是高频访问,但因其更新少,使用LFU能让其较长时间保留在缓存中。分布式缓存(如Redis)可以提供大容量的缓存空间,满足大量商品数据的存储需求。
2. 数据更新策略
- 对于更新频繁的热门商品:
- 在数据更新时,首先更新数据库,确保数据的持久化。
- 同时立即更新一级缓存(应用内缓存),保证缓存数据的一致性。
- 异步更新二级缓存(分布式缓存),可以通过消息队列(如Kafka)来异步处理更新操作,减少对主业务流程的影响。
- 对于更新相对较少的商品:
- 数据更新时,同样先更新数据库。
- 然后同步更新二级缓存(分布式缓存),由于更新频率低,同步操作对系统性能影响不大。
- 一级缓存(应用内缓存)若有该商品数据,可设置较短的过期时间,在下一次请求时从二级缓存中重新加载,以保证数据一致性。
3. 缓存命中处理
- 一级缓存命中:直接返回数据,响应速度最快,极大提高系统性能。
- 一级缓存未命中但二级缓存命中:将数据从二级缓存加载到一级缓存(如果符合LRU策略),然后返回数据。这样下次请求该数据时可直接从一级缓存获取,提高后续缓存命中率。
- 两级缓存都未命中:从数据库读取数据,先写入二级缓存(符合LFU策略),再根据商品热门程度决定是否写入一级缓存(符合LRU策略),最后返回数据。
4. 平衡缓存命中率、数据一致性和系统性能
- 缓存命中率:通过分层缓存和合适的缓存算法(LRU和LFU),针对不同更新频率和访问模式的商品数据进行存储,提高缓存命中率。同时,命中后将数据在不同层级缓存间合理迁移,进一步提升后续命中率。
- 数据一致性:对于更新频繁的热门商品,通过先更新数据库,立即更新一级缓存,异步更新二级缓存的策略,在保证数据最终一致性的同时,尽量减少对业务的影响。对于更新少的商品,同步更新二级缓存,通过设置一级缓存过期时间保证一致性。
- 系统性能:一级缓存采用应用内缓存,利用内存快速访问特性,减少响应时间。二级缓存采用分布式缓存提供大容量存储。数据更新时,对于频繁更新数据采用异步更新二级缓存方式,减少对主流程的阻塞,从而提升系统整体性能。