面试题答案
一键面试1. 缓存层次设计
- 多级缓存:采用至少两级缓存架构,如一级缓存(L1)使用本地内存缓存(如 Android 中的 LruCache 或 iOS 中的 NSCache),用于快速响应最近使用的数据请求。二级缓存(L2)采用分布式缓存(如 Redis),存储相对不那么频繁访问但仍需快速获取的数据。
- 读缓存优先:在读取数据时,首先从 L1 缓存尝试获取。若未命中,则从 L2 缓存读取。若 L2 缓存也未命中,则从数据库或其他数据源加载数据,并依次写入 L2 和 L1 缓存。
2. 缓存策略定制
- 电商购物模块:
- 读写模式:读多写少,商品信息、价格等相对稳定。
- 数据特性:数据量较大,不同商品分类有不同的访问频率。
- 缓存策略:对热门商品设置较长的缓存过期时间,采用基于时间和访问频率的淘汰策略。例如,使用 LRU - Time 策略,既考虑最近最少使用,又结合过期时间。对于价格变动等写操作,采用缓存失效和更新相结合的策略,先更新数据库,再立即更新缓存。
- 用户社交模块:
- 读写模式:读写较为频繁,用户动态、好友关系等实时性要求较高。
- 数据特性:数据量随用户数量增长,用户个性化强。
- 缓存策略:采用短缓存过期时间(如几分钟)来保证数据实时性。对于用户动态,可使用时间窗口淘汰策略,即保留一定时间内的动态缓存。写操作时,采用先更新缓存再异步更新数据库的方式,提高响应速度,但要注意数据一致性,通过重试机制或消息队列确保数据库最终一致性。
- 内容推荐模块:
- 读写模式:读多写少,推荐内容基于算法生成,相对稳定。
- 数据特性:数据量大且需根据用户行为动态调整。
- 缓存策略:按用户画像和推荐算法的不同分组设置缓存。例如,根据用户兴趣标签分为不同类别。采用基于用户行为反馈的缓存更新策略,如用户对某推荐内容的点击、浏览等行为触发相关推荐缓存的更新。设置较长的缓存过期时间,但定期根据算法更新情况强制刷新缓存。
3. 缓存扩展性
- 分布式缓存集群:对于 Redis 等分布式缓存,采用集群模式(如 Redis Cluster),通过数据分片将海量数据均匀分布在多个节点上,提高缓存的存储容量和并发处理能力。每个节点负责一部分数据的读写,通过一致性哈希算法确保数据在节点间的均衡分布。
- 动态扩展:能够根据业务增长动态添加或移除缓存节点。在增加节点时,通过数据迁移机制将原有节点的数据平滑迁移到新节点;移除节点时,确保数据不丢失,其他节点能够接管其数据读写请求。
4. 高并发处理
- 缓存穿透处理:采用布隆过滤器(Bloom Filter)防止查询不存在的数据穿透到数据库。在查询前先通过布隆过滤器判断数据是否存在,若不存在则直接返回,避免无效查询到数据库。
- 缓存雪崩处理:为缓存设置随机的过期时间,避免大量缓存同时过期。同时,采用互斥锁(如 Redis 的 SETNX 命令)在缓存失效时保证只有一个请求去加载数据,其他请求等待,待数据加载并写入缓存后再放行,防止大量请求同时涌入数据库。
- 缓存击穿处理:对于热点数据,采用永不过期的策略,并通过后台线程定时更新缓存数据,或者使用二级缓存,一级缓存设置较短过期时间,二级缓存设置较长过期时间,当一级缓存失效时从二级缓存获取数据,保证高并发下热点数据的快速访问。
5. 数据一致性
- 读写锁:在一些读写操作冲突较频繁的场景下,采用读写锁机制。读操作可以并发执行,但写操作前先获取写锁,阻止其他读写操作,确保写操作时数据的一致性。
- 缓存更新策略:根据不同业务模块特点选择合适的缓存更新策略,如先更新数据库再更新缓存、先更新缓存再异步更新数据库、缓存失效等策略,并结合重试机制和监控系统,确保数据一致性问题能及时发现和解决。
6. 监控与维护
- 性能监控:使用工具(如 Redis - Sentinel 对 Redis 进行监控)实时监测缓存的命中率、读写延迟、内存使用等指标。设置告警阈值,当命中率过低、延迟过高或内存接近饱和时及时通知运维人员。
- 缓存清理与优化:定期清理过期数据和长时间未使用的数据,优化缓存的存储结构和数据布局,提高缓存的空间利用率和访问效率。同时,根据业务变化及时调整缓存策略和配置参数。