模块四作业
设计千万级学生管理系统的考试试卷存储方案
【作业要求】
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
完善 Redis 的数据结构设计,明确使用哪种 Redis 数据结构
设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)
对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
Redis 存储试卷的数据格式
Redis 一共 5 种数据结构:
String 类型。
Hashtable:Hash 表。
Linked list:可重复,插入顺序排序。
Set:不可重复,无序。
Sorted set:不可重复,按照 score 排序。
选择 String 类型来存储考试试卷。
Key: 学校 Id+课程 Id+试卷 Id
value: 试卷内容的 json 文本
原因是考虑试卷一旦上传,基本不会再更改;即使更改,也可以试卷 json 整体更改。所以不考虑将试卷中的每道题拆分存储到 list 或 set 中。
读写流程
教师试卷编辑完成后,上传试卷,存储到 Key: 学校 Id+课程 Id+试卷 Id。
教师对试卷进行修改或删除时,根据 key 修改或删除
学生考试时,先根据登录学号、课程关系等计算出该考生能够参加的试卷 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。
版权声明: 本文为 InfoQ 作者【double蠢】的原创文章。
原文链接:【http://xie.infoq.cn/article/83a1ef75923f9b8fc71b81c31】。文章转载请联系作者。
评论