写点什么

模块四作业:千万级学生管理系统的考试试卷存储方案

作者:dean
  • 2021 年 11 月 20 日
  • 本文字数:1275 字

    阅读完需:约 4 分钟

【作业要求】基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。


【考试】假设每门学科每年 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/每秒。


数据结构设计


试卷存储(S1)


使用 String


key:前缀(E)+课程编码+试卷编码 (e.g. T_A10_E11)


value:试卷内容(json 串,包含: 标题、说明、注意事项、第几次考试、内容编码、创建人、创建时间)


试卷内容存储(S2)


使用 Hash


key: 前缀(E)+课程编码 (e.g. T_A10)


hashkey:内容编码


hahvalue:题目序号、题目类型、题干、选项、分值、参考答案


题库(S3)


使用 Hash


key: 前缀(T)+课程编码 (e.g. T_A10)


hashkey:题目类型


hahvalue:题目序号、题目类型、题干、选项、分值、参考答案


考试结果存储(S4)


使用 Hash


key: 课程编码+考试编码+班级编码


hashkey:学号


hahvalue:[总得分、考试结果{题目序号、答案、得分、状态、保存时间、更新时间、操作人}、评卷人、评卷时间、提交人、提交时间}]


读写流程


教务处根据课程,负责从题库(S3)组合试卷,可得到试卷存储(S1)、试卷内容存储(S2);


学生考试系统,根据登录学生的学号,考试的课程编码,得到所在班级、考试课程从 S1、S2 得到试卷内容进行展示;


学生在线答卷提交后,根据课程编码、班级编码、学号、得到考试结果存储(S4);


老师在线批卷,根据课程编码、班级编码、 S1、S2、S4 得到学生答题卷面,并根据提示进行判分,更新 S4。


估算集群服务器数量及性能


分析:设每个试卷 100K 大小,试卷存储量为: 240*0.1M= 24M;试卷存储量 24M 忽略不计,主要考虑试卷结果存储量 .

学校考试都安排在一个月内,则每个月考试结果存储空间为:

1000 万* 20(课)* 2(考试次数) * 1M(答案)= 400GB。

每天提交数据为:400GB/30=13.4GB

第周提交数据为:13.4*=93.8GB


存储角度: 一天的数据提交大概为 13.4Gb,一周大概 94GB,可以用一个 Redis Sentinel 集群存储。一周后的结果 dump 到 Mysql。

性能角度: 50k QPS, 单机 30K QPS 比较正常,使用 3 实例 (32 核*128GB)的 Redis Sentinel 。

发布于: 2 小时前阅读数: 5
用户头像

dean

关注

还未添加个人签名 2019.11.06 加入

还未添加个人简介

评论

发布
暂无评论
模块四作业:千万级学生管理系统的考试试卷存储方案