之前
难点
- 业务层面:1.课程小节类型多 2.涉及业务广:C端课程进度、完成情况、学习记录;B端课程、计划学习数据统计
- 技术层面:数据更新频繁(单机150qps,8服务)
重构:
1.LearnDurationConsumer(写缓存)
- 业务层面:1.从使用频率低的文章小节入手;2.特殊场景处理:观看跨小时问题,课程完成判定等
- 技术层面:LinkedHashMap localDataMap(作为LRU,设置accessOrder=true,重构removeEldestEntry)
2.生产者(数据同步至db)
采用部分同步+全同步的机制,同步时清理localDataMap
- 部分同步的取数逻辑:1.轮询集合中最新的350个元素,从中筛选cost>60s的50个元素 2.50个超过150s的老元素(全同步时,策略变为500个老元素)
- 全同步的触发时机:1. localDataMap数据超限,执行removeEldestEntry 2.tomcat服务结束回调 3.部分执行时有3%概率
- 同步db时由异步线程统一执行(子、主表一条sql)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。