面试题答案
一键面试缓存架构设计以平衡实时性与数据一致性
- 分层缓存设计
- 前端缓存:在客户端(如浏览器、移动应用)设置缓存,缓存一些静态资源,如直播封面、主播基本信息等不频繁变动的数据。这样可以减少对后端的请求,提高响应速度,优化实时性。
- 边缘缓存:使用 CDN(内容分发网络)作为边缘缓存,CDN 节点分布在网络边缘,离用户更近。它可以缓存视频片段等内容,根据用户地理位置快速响应请求,进一步提升实时性。同时,CDN 通常有一定的更新机制来保证数据一致性,比如设置合适的缓存过期时间。
- 应用层缓存:在应用服务器内部设置缓存,例如使用 Redis 等内存数据库。缓存直播过程中的一些关键数据,如直播状态、在线人数等。对于这类数据,需要根据业务场景设置合适的更新策略,以兼顾实时性和一致性。比如,直播状态变化时,及时更新缓存并通知相关节点。
- 数据分类与缓存策略
- 静态数据:对于基本不会变动的静态数据,如直播平台的 logo、一些固定的介绍文字等,设置较长的缓存时间,甚至可以采用永不过期的策略,以最大程度利用缓存,提高实时性。
- 半静态数据:像主播的简介、直播间的规则等相对不频繁变动的数据,可以设置适中的缓存过期时间,定期更新缓存。更新时采用先更新数据库,再更新缓存的策略,保证数据一致性。
- 动态数据:对于直播中的实时数据,如弹幕、实时点赞数等,采用实时更新缓存的策略。可以使用消息队列(如 Kafka)来接收实时数据,然后异步更新缓存,确保数据的实时性。同时,为了保证一致性,可以定期将缓存中的数据同步回数据库。
实时性与一致性冲突的解决策略
- 读写锁策略
- 在缓存更新操作时,使用读写锁。读操作可以并发进行,以保证实时性,因为读操作不会改变数据。而写操作则需要获取写锁,在写锁获取期间,其他读写操作都被阻塞,确保数据一致性。写操作完成后释放写锁,恢复读写并发。
- 缓存失效策略
- 主动失效:当数据发生变化时,主动使相关缓存失效。例如,直播结束时,主动清除直播间相关的所有缓存数据。这样在下一次请求时,会重新从数据源获取数据,保证数据一致性。同时,为了减少缓存失效带来的性能影响,可以采用批量失效的方式,而不是单个失效。
- 被动失效:设置合理的缓存过期时间,对于实时性要求不太高的数据,在缓存过期后,重新从数据源读取数据并更新缓存。这样既保证了一定的实时性,又在过期后能恢复数据一致性。
- 异步更新策略
- 利用消息队列进行异步更新。当数据发生变化时,先将更新消息发送到消息队列,然后立即返回给客户端,保证实时性。后台有专门的消费者从消息队列中读取消息,按照顺序更新缓存和数据库,确保数据一致性。这样可以避免因同步更新缓存和数据库导致的响应延迟,提高系统的并发处理能力。