面试题答案
一键面试缓存命中率相关策略
- 多级缓存架构:
- 采用本地缓存 + 分布式缓存:本地缓存(如 Guava Cache)用于快速响应热点数据请求,在应用服务器本地存储部分常用数据,减少对分布式缓存的压力。分布式缓存(如 Redis)作为主要缓存层,存储大部分动态数据。例如,对于经常访问的前 10% 热门用户的动态,先从本地缓存获取,若未命中再从 Redis 中获取。
- 设置不同缓存级别:根据数据的访问频率和重要性设置不同级别的缓存。比如,将超级热点动态数据(如明星发布的动态)放在一级缓存,设置较长的过期时间;普通热门动态放在二级缓存,过期时间适中;不太热门的动态放在三级缓存,过期时间较短。
- 缓存预取:
- 基于用户行为预测:分析用户历史行为数据,预测用户可能感兴趣的动态内容。例如,如果用户经常在晚上 8 - 10 点浏览健身相关动态,在这个时间段前,提前将最新的健身动态缓存到用户对应的缓存空间中。
- 基于时间规律:对于一些周期性更新的动态,如每天早上发布的新闻类动态,在发布前预取并缓存到相关缓存层,确保用户打开应用时能快速获取。
- 缓存分片:
- 按照用户 ID 分片:根据用户 ID 的哈希值将缓存数据分散到不同的缓存节点上。这样,每个用户的动态数据都相对集中在特定的缓存节点,当用户请求时能快速定位到对应缓存,提高命中率。例如,通过取模运算将用户 ID 映射到不同 Redis 节点。
- 按照动态类型分片:将不同类型的动态(如文本动态、图片动态、视频动态)分别缓存到不同的区域或节点。当用户请求特定类型动态时,直接从相应缓存区域获取,减少缓存查找范围,提升命中率。
缓存更新机制相关策略
- 写后更新:
- 同步更新:当用户发布新动态或对已有动态进行修改、删除操作时,同时更新缓存和数据库。例如,在用户发布一条新动态后,先将新动态写入数据库,成功后立即更新 Redis 缓存中该用户的动态列表,确保缓存数据的一致性。
- 异步更新:通过消息队列(如 Kafka)实现缓存更新。当有数据变更操作时,将更新消息发送到消息队列,由专门的消费者从队列中取出消息并异步更新缓存。这样可以避免同步更新带来的延迟,提高系统响应速度。例如,用户删除一条动态后,将删除消息发送到 Kafka 队列,消费者从队列获取消息后更新 Redis 缓存。
- 写前失效: 在对数据库进行写操作前,先使对应的缓存失效。例如,当用户要修改一条动态内容时,在更新数据库之前,先删除 Redis 中该动态的缓存数据。这样,下次用户请求该动态时,缓存未命中,会从数据库加载最新数据并重新缓存,保证数据的准确性。
- 缓存过期策略:
- 设置合理的过期时间:根据动态数据的特性设置不同的过期时间。对于时效性强的动态(如实时热点事件相关动态),设置较短的过期时间,如 1 - 5 分钟;对于一般性动态,设置较长的过期时间,如 1 - 2 小时。
- 主动更新过期缓存:除了依靠自然过期,在系统空闲时段主动检查并更新即将过期的缓存数据。例如,在凌晨 2 - 4 点系统访问量较低时,遍历缓存中即将过期的动态数据,从数据库获取最新数据并重新缓存,确保用户在白天使用应用时能获取到最新且准确的动态信息。