考试试卷存储方案
1.数据结构设计
考试试卷上的试题有选择、判断、简答等不同类型的题,但是不同于驾校或认证考试类的系统的题库。学校的考试通常考过的会对历史的考试试题进行调整,或是重新出卷,因为不需要将试题拆分成单独的 key 进行存储,而是可以将整张试卷的试题作为整个对象进行存储存储考试试卷应当采用 Redis 的 Hash 结构进行存储。这样也可以减少将多个试题组装成一张试卷的时间。
此外由于历史考过的试卷通常不会重复出现在考试中,可以将其持久化存储到关系型数据库 MySQL 或 Hbase 中,需要查看的时候再重新加载即可。
数据 key 的设计可以充分利用 Redis 的 key 目录结构,学科:年份:学期:试卷类型(A/B 卷),这样也便于基于学科和年份等对试卷进行查询和修改。
2.读写流程
出题人出试卷时需选择试卷的学科,年份和类型,编写试卷后,将试卷保存到 Redis 中;
如果只是对部分试题需要修改,如出现错误等需要进行调整,可以只对 Hash 结构中的部分试题数据进行调整;
考生考试时根据其所考学科和当前学年,并根据其具体专业等因素确定试卷类型,查询对应的试卷信息。
3.集群的服务器数量和性能
3.1 存储量和性能需求估算
每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内)。学校的考试都安排在某一个月内,考试的时候请求试卷,考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,因此可以进行如下估算:
试卷的存储量:20(课)* 2(考试次数) * 2(学期) * (20*200 字节+20*200 字节+4*400 字节)*3(年)= 2M。
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
3.2 集群服务器数量和性能
试卷的存储空间较小,单个 Redis 节点即可完成数据的存储,但为了保证数据的可用性,可以选用 2 台服务器。
Redis 的单节点平均读请求的 QPS 可以达到 10W+,但是为了保证集群的高可用和高性能,选用 2 个节点,可以更好地减轻单节点压力提高性能。
评论