作业四:学生考试系统试卷储存方案
0.题目 &背景
![](https://static001.geekbang.org/infoq/59/596ec695763bb55af7d5eb9034c9120c.png)
【考试】
假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以 内),考试结果永久保存,在校学生能够看到自己曾经的考试结果,
则考试结果记录的存储量为:
• 在校学生:1000 万 * 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(只有前三年考试)= 2.4T。
• 离校学生:每年 250 万,存储量为 0.6T。
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时, 且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
• 请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
• 提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。
1.数据结构设计
采用 redis5 种数据结构中的 List 进行储存有顺序的考试题目,key 的组成为:学校_学年_学期_考试科目
2.缓存读写流程
2.1 试卷缓存写入
当试卷出题人完成出题时,可将试卷数据存入缓存中,按照 1 中的数据结构设置好 key,value 为试卷题目,需按照顺序以 json 格式存入缓存中。
2.2 试卷缓存读
考试的时候,学生登录考试系统,开始考试之后,试题内容从 Redis 缓存中根据试题的科目生成的缓存 Key 取出试题内容,可以按照下标一个一个的取出,也可以按照下标批量或者全部将试题取出,具体读出试题的规则看考试系统前端页面的展示形式来定。
3.Redis 集群规模设计
一套试卷内容(20 个判断题+20 个选择题+4 个大题)占用内存的大小的估算,假设一道判断题平均由 50 个字符组成,一个选择题和选项平均由 150 个字符组成,一个大题平均由 200 个字符组成,另外一套试卷中平均出现 20 张图片(每张图片大小 100KB),则一套试卷占用的内存:
判断题:20*50*2 = 2000byte = 2KB
选择题:20*150*2= 6000byte = 6KB
大题:4*200*2=1600bye = 2KB
图片:20*100KB=2M
所以一套试题占用的内存大小估算为:3M。
由于学生总量为 1000 万,分布在各个学校之中,每次考试学校内题目必定相同。所以假设一个学校 2.5 万人,总共有 400 所学校,一个学期 20 门课程,有两个学期且集中在某一个月内考试,所以缓存只需要储存某一年的考试题目即可,后续可持久化至 mysql 数据库中。
这样算下来总的考试题目数据量为:400*20*2*3/1024=46GB
缓存数据较大需要采用 redis 集群方式储存,一主三从的储存方式,请求压力分销至三台 slave 服务器中
版权声明: 本文为 InfoQ 作者【许四多】的原创文章。
原文链接:【http://xie.infoq.cn/article/c049236ffac2a199b6e235060】。文章转载请联系作者。
评论