写点什么

第九期 - 模块四

作者:wuli洋
  • 2022-10-31
    北京
  • 本文字数:601 字

    阅读完需:约 2 分钟

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


评估性能需求

【考试】

1. 在校学生考试结果存储:2.4T;

2. 离校学生考试结果存储:每年增长 0.6T;

3. 试卷请求 QPS:5 万/s;

4. 提交试卷 TPS:1700/s。


选择存储系统

Redis sentinel


设计存储方案

设计数据结构

  1. 每个学校、科目使用的试卷不一样,且存在不同版本(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 核作为数据节点即可。


用户头像

wuli洋

关注

还未添加个人签名 2019-12-07 加入

还未添加个人简介

评论

发布
暂无评论
第九期 - 模块四_wuli洋_InfoQ写作社区