写点什么

模块四作业

作者:double蠢
  • 2021 年 11 月 20 日
  • 本文字数:1111 字

    阅读完需:约 4 分钟

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

【作业要求】

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

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

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

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


Redis 存储试卷的数据格式

Redis 一共 5 种数据结构:

  1. String 类型。

  2. Hashtable:Hash 表。

  3. Linked list:可重复,插入顺序排序。

  4. Set:不可重复,无序。

  5. Sorted set:不可重复,按照 score 排序。


选择 String 类型来存储考试试卷。

Key: 学校 Id+课程 Id+试卷 Id

value: 试卷内容的 json 文本

原因是考虑试卷一旦上传,基本不会再更改;即使更改,也可以试卷 json 整体更改。所以不考虑将试卷中的每道题拆分存储到 list 或 set 中。

读写流程

  1. 教师试卷编辑完成后,上传试卷,存储到 Key: 学校 Id+课程 Id+试卷 Id。

  2. 教师对试卷进行修改或删除时,根据 key 修改或删除

  3. 学生考试时,先根据登录学号、课程关系等计算出该考生能够参加的试卷 Key, 然后从 Redis sentinel 集群中读取试卷内容。

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


假设每门考试的题型是 20 判断题、20 选择题、4 道大题。假设每道判断题题干 100 字以内,每道选择题题干 400 字以内,每道大题题干 800 字以内。

每份试卷存储字节=20*100*2 + 20*400*2 + 4*800*2 = 26400 字节~26KB


假设每门学科每年 2 次考试,每个学生平均一学期 20 门课。那么, 一个学生 1 年有 40 次考试(40 份试卷),一年总共有 4000 万份试卷(1000 万*40)。考虑到上同一门课的学生读取的试卷是同一份,假设平均 60 人上同一门课程;则 1 年需要存储 17.3GB(26KB*4000 万/60)。


试卷在考试完成后,可以归档到 Mysql 或 Hbase。 因此 Redis 中可以只存储当年的或甚至半年的试卷。


课程中分析了:

假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:

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

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

试卷结果采用 HBase 集群方式,提交试卷的 TPS 也不高,暂不考虑。因为请求试卷的 QPS 比较高,考试试卷采用 Redis sentinel 集群方式。

对于 32 核服务器,单机性能量级是 5-10 万,能够满足请求试卷的性能要求。因为 Redis sentiel 是主从复制,读写分离,集群选举方案,至少需要 3 台 23 核服务器。考虑到性能上可以有一定冗余, 内存可以选择 32G。


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

double蠢

关注

还未添加个人签名 2019.08.13 加入

还未添加个人简介

评论

发布
暂无评论
模块四作业