架构实战营 第 4 期 模块四作业
千万级学生管理系统的考试试卷存储方案
一、 Redis缓存结构设计
1. 考试与试卷关系存储结构
用于存储 考试关联的试卷,通过一场考试找到对应的试卷
key:学校id+考试id
value:试卷id集合
一场考试可能会关联多份试卷(比如:单双号),一个人考试时抽取其中的一份试卷进行考试。
每场考试都是唯一的,所以考试id可以唯一标识一场考试,key前缀使用学校id进行组织隔离
2. 试卷存储结构
用于存储试卷中的题目信息
key:学校id+试卷id
value:题目集合
试卷id可以唯一标识一份试卷,所以采用试卷id做key,前缀使用学校id进行组织隔离
3. 试卷答案存储结构
用于存储试卷中题目的答案信息
key:学校id+试卷id+answer
value:题目集合(题目id及答案)
题目答案在试卷中不允许存放,防止将答案下发给考生,所以单独用key存储题目的答案信息,而且学生答案校验一般是考试结束才会进行分数计算,所以题目数据不单独存储,使用试卷直接获取所有答案进行分数计算
二、 考试试卷读写流程
1. 创建考试试卷流程
2. 学生考试时试卷获取流程
3. 学生考试结束流程
三、 考试试卷性能评估
1. 写性能
一个专业有10门课,一个学校40个专业,1000万学生按每个学校20000学生计算,大概为500所学校,学校每学期进行一次期末考试,考试结束后试卷缓存就可以清除,所以缓存中只需要考虑一次期末考试即可
一个学校单次考试总数:10(门课)*40(专业)*4(个年级)=1600场考试
总考试数量:1600(单个学校)*500 = 80万
经过分析:单学期考试大概会有80万场考试,不考虑一场考试多套试卷情况(这种情况相对会少很多),会有80万份试卷数据缓存
一份试卷由20道判断题,20道选择题,4道大题组成,判断题、选择题:单题200字(600字节),答题:单题400汉字(1200字节),一份试卷大概:,80万份试卷需要21GB存储
总结:单节点Redis存储80万份考试没问题,使用64GB内存服务器即可
2. 读性能
根据第六讲考试性能分析:请求试卷为5万/每秒,对应redis来说 5万读请求单节点应该没有压力。
试卷请求流量大概有5万*28KB≈1G,Redis单节点无法满足读取要求,按照每个节点100MB的网络,需要10个节点可以满足网络吞吐要求,使用Redis主从架构或者Redis sentinel 集群,每个节点存储全量数据
总结:由于网络吞吐的限制,需要10个Redis节点分摊读请求压力,采用32G内存服务器,100MB带宽
3. 总结
平常教学期间: 学校考试集中在每学期末,平常使用人数相对较少,Redis服务部署3个节点即可,使用Redis sentinel 集群,方便在高峰期进行扩缩容
考试高峰期:大部分学校都会在学期末进行集中考试,使用10台32G内存服务器,每台需要100MB带宽,使用Redis sentinel 集群进行读写分离,可以方便的进行横向扩展