写点什么

千万级学生管理系统的考试试卷存储方案

作者:Steven
  • 2021 年 11 月 16 日
  • 本文字数:1203 字

    阅读完需:约 4 分钟

【作业要求】

基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:

• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。

• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。

• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。


数据结构设计

Redis 有 5 种基础数据结构,分别是:string、list、hash、set 和 sorted set。

对于试卷来说可以直接采用 string:

key:学校 ID + 试卷 ID。

value:试题内容,JSON。


试卷 ID = 课程 ID(年级+院/系+专业+学年+学期+课程)+ 考试次数

例如:

200008001200110011 = 2000(2000 级)+08(院/系)+001(专业)+2001(学年)+1(学期)+001(课程)+1(考试次数)


读写流程

创建试卷

  1. 教师登录系统后,选择创建试卷。

  2. 考试服务返回创建试卷页面。

  3. 教师定义所有试题内容。

  4. 所有试卷内容填写完成后,教师提交创建试卷请求。

  5. 考试服务把试卷保存到 Redis。

  6. 考试服务把试卷保存到 HBase。

  7. 返回创建成功提示给教师。


读取试卷(考试场景)

基于到 5 万/秒的性能需求,这里从 Redis 读取数据。

  1. 学生登录系统后,选择“我要考试”。

  2. 考试服务返回选择页面给学生。

  3. 学生选择试卷后提交开始考试请求。

  4. 考试服务从 Redis 获取试卷内容。

  5. 考试服务返回试卷页面给学生。


读取试卷(其它场景)

学生查看自己成绩,或者教师查看、改试卷、批卷等场景,不会有集中高并发的访问需求,直接从 HBase 读取即可。


存储性能估算

1000 万学生,假设每个专业 200 人,一共 5 万个专业,每个学校 1.5 万人,则 700 个学校,每个学校 75 个专业。

假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试 20 道判断题、20 道选择题、4 道大题,每道试题题目 200 字以内,则考试结果记录的存储量为:

50000(专业)* 20(课)* 2(考试次数) * 10000(试题)* 1(当前学期) * 3(只有前三年考试)= 60G。

假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,

且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:

• 请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟= 250 万请求/分钟≈ 5 万/每秒。

• 提交试卷: 1000 万* 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟= 1700/每秒。


Redis sentinel 集群的服务器数量和性能

基于上面试卷的存储性能估算,试卷存储 = 60G,试卷请求 = 5 万/s。Redis sentinel 集群采用 一主两从三哨兵即可。共 6 台服务器。如果存在有可用的哨兵集群,则 3 个哨兵可以节省掉。


关键设计

Redis sentinel 集群只保留当前学期的试卷,用于学生考试时获取试卷,下个学期开始前就可以把试卷数据全部清掉,甚至于考试结束后即清除,则可以再节省一半的空间。其它场景有查看试卷的需求都从 HBase 读取。


用户头像

Steven

关注

还未添加个人签名 2008.07.18 加入

还未添加个人简介

评论

发布
暂无评论
千万级学生管理系统的考试试卷存储方案