设计千万级学生管理系统的考试试卷存储方案
Redis 数据结构设计
试卷
key: "paper:学校 ID:年度:学期:科目"
数据结构:string
内容:加密后的序列化试卷数据,如通过 aes 加密的试卷数据
学生试卷关联
key:"student_paper:学校 ID:年度:学期:科目"
数据结构:有序集合
内容:field 为学生 ID,score 为考试时间的时间戳
读写流程设计
试卷编排业务
老师登录
通过界面选择年度、学期、科目,编排试卷,保存时将试卷数据进行序列化并加密,存储到以""paper:学校 ID:年度:学期:科目"为 key 的 string 结构 key 中,不能设置有效期
选择年度、学期、科目,选择要考试的学生,分批设置考试时间,以"student_paper:学校 ID:年度:学期:科目"为 key 的有序集合中,以学生 ID 为 field,考试时间为 score,不能设置有效期
学生考试服务
学生登录
根据当前年度、学期、科目,通过当前时间,以当前时间前 30 分钟、后 1 分钟时间戳为 score 范围,从学生试卷管理 key "student_paper:学校 ID:年度:学期:科目" 中获取学生 ID
根据当前年度、学科、科目,从试卷 key "paper:学校 ID:年度:学期:科目" 获取试卷信息,在 server 端解密后通过接口返回
服务器数量及性能估算
假设总计 1000 所学校,每门学科每年 2 次考试,每个学生平均一个学期 20 门课,每门考试包括 20 判断题、20 选择题、4 道大题(题干 200 字内)试题永久保存。
则试卷记录的存储量为:
在校学生试卷:1000(学校) * 20 (课) * 4000(试卷) * 2(学期) * 3 (只有前三年考试) = 512M
在线学生试卷关联:1000w(学生) * 20 (课) * 2(学期) * 3 (只有前三年考试) = 1.2G
离校学生:
试卷数量无变化,每年均为 512M + 1.2G/ 4 = 850M 左右
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
综上:
内存每年占用约为 1.7G,每年增幅约为 850M
使用 3 台 8G 服务器部署 sentinel 监控服务,3 台 32G 内存 CentOS 部署 redis 主从服务,
评论