面试题答案
一键面试设计思路
- 业务场景分析与分类
- 直播课程实时数据推送:对实时性要求极高,数据更新频繁,需保证用户看到最新直播状态。
- 学员学习进度跟踪:关注数据准确性和一致性,在用户学习过程中及时更新进度并持久化。
- 课程购买交易:涉及金额等关键数据,对数据一致性和事务性要求严格,确保交易安全。
- 分层缓存架构
- 前端缓存:在客户端(如浏览器、移动应用)设置缓存,减轻后端压力。对于直播课程,缓存直播画面的静态资源(如背景图片等);对于学员学习进度,缓存近期学习记录用于快速展示。使用本地存储或内存缓存实现,根据业务需求设置合适的缓存过期策略。
- 应用层缓存:在应用服务器上设置缓存,使用如 Ehcache 等。针对直播课程,缓存直播的元数据(如主播信息、课程简介等);对于学员学习进度,缓存短时间内频繁读取的进度片段;课程购买交易时,缓存商品详情等不频繁变动的数据,减少数据库查询。
- 分布式缓存:采用 Redis 等分布式缓存。对于直播课程实时数据,如在线人数、实时互动消息等,利用 Redis 的发布订阅功能实现实时推送;学员学习进度的关键节点数据持久化到 Redis 以保证一致性;课程购买交易时,使用 Redis 实现分布式锁来保证交易原子性,防止超卖等问题。
- 缓存策略制定
- 读写策略:对于直播课程实时数据以写后读为主,优先保证写操作的实时性,读操作尽量从缓存获取;学员学习进度跟踪采用读写结合策略,读时优先从缓存取,写时同步更新缓存和数据库;课程购买交易先写缓存标记,再异步持久化到数据库,读时保证数据一致性。
- 过期策略:直播课程实时数据设置较短过期时间,如几分钟;学员学习进度关键节点数据不过期,其他辅助数据设置较长过期时间;课程购买交易相关缓存,在交易完成后及时删除。
关键技术点
- 缓存穿透:使用布隆过滤器。对于直播课程、学员学习进度、课程购买交易中可能查询但不存在的数据,通过布隆过滤器提前拦截,避免查询穿透到数据库。
- 缓存雪崩:对不同业务场景的缓存设置随机过期时间,避免大量缓存同时过期。同时设置多级缓存,当一级缓存失效时,二级缓存能提供一定保护。
- 缓存击穿:针对直播课程热点数据、课程购买热门商品等,使用互斥锁或本地缓存(如 Guava Cache)作为保护机制,防止高并发下单个热点数据缓存失效导致大量请求直接打到数据库。
- 数据一致性:对于学员学习进度和课程购买交易等对数据一致性要求高的场景,采用缓存与数据库双写一致性方案,如先更新数据库,再更新缓存,同时结合分布式事务(如 Seata)保证数据最终一致性。对于直播课程实时数据,因实时性优先,允许一定程度的数据不一致。