第九期 - 模块四
设计千万级学生管理系统的考试试卷存储方案
评估性能需求
【考试】
1. 在校学生考试结果存储:2.4T;
2. 离校学生考试结果存储:每年增长 0.6T;
3. 试卷请求 QPS:5 万/s;
4. 提交试卷 TPS:1700/s。
选择存储系统
Redis sentinel
设计存储方案
设计数据结构
每个学校、科目使用的试卷不一样,且存在不同版本(A/B 卷),因此符合一个 kv 存储,
key:学校 id + 科目 id + 试卷版本
value:具体试卷题目,因为答题过程中有可能在试卷中选择不同的题目跳答(需要分屏显示试题),因此选择 hashtable 结构,其中 field 为题目序号,val 为具体题目 string;这样每次读数据
为什么不用 string 存储每张试卷?容易有 big key,一般 redis 超过 10w 就容易产生 big key,影响读写效率
为什么 key 不细化到题目纬度,val 直接存储每道题目:防止 key 过多,单机无法放下得需要数据分片,不符合简单/合适原则;
验证读写场景
试卷创建:出题时创建一次
试卷查询:考试期间,学生并发多次请求试卷的不同的题目进行答题,需要根据学生的班级,组合其学校+考试科目+试卷版本形成 key,去 redis 查询出对应科目的考试试卷,然后根据学生答题序号选择对应的题目返回。
试卷删除:考试完成后,定期删除一次
评估读写性能
因为 QPS:5 万/s;,正常 redis 单机的读写性能 5-10w,因为我们需要考虑考试期间单机故障需要仍能保持可用;而 sentinel 哨兵节点其维持 3 台 redis 机群的选主和监控的计算量并不大,因此最好使用 3 台 1 核 2G 作为 sentinel 机器;选 3 台 32 核作为数据节点即可。
评论