写点什么

架构实战营 第 4 期 模块四作业

作者:
  • 2022 年 1 月 08 日
  • 本文字数:1257 字

    阅读完需:约 4 分钟

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

一、 Redis 缓存结构设计

1. 考试与试卷关系存储结构

用于存储 考试关联的试卷,通过一场考试找到对应的试卷

key:学校 id+考试 id

value:试卷 id 集合

一场考试可能会关联多份试卷(比如:单双号),一个人考试时抽取其中的一份试卷进行考试。

每场考试都是唯一的,所以考试 id 可以唯一标识一场考试,key 前缀使用学校 id 进行组织隔离

2. 试卷存储结构

用于存储试卷中的题目信息

key:学校 id+试卷 id

value:题目集合

试卷 id 可以唯一标识一份试卷,所以采用试卷 id 做 key,前缀使用学校 id 进行组织隔离

3. 试卷答案存储结构

用于存储试卷中题目的答案信息

key:学校 id+试卷 id+answer

value:题目集合(题目 id 及答案)

题目答案在试卷中不允许存放,防止将答案下发给考生,所以单独用 key 存储题目的答案信息,而且学生答案校验一般是考试结束才会进行分数计算,所以题目数据不单独存储,使用试卷直接获取所有答案进行分数计算

二、 考试试卷读写流程

1. 创建考试试卷流程

  1. 管理员后台创建试卷,试卷数据保存数据库

  2. 管理员创建考试并关联考试的试卷

  3. 将考试与试卷关联关系保存至 Redis 缓存

  4. 将试卷信息保存至 Redis 缓存

  5. 将试卷答案信息保存至 Redis 缓存

2. 学生考试时试卷获取流程

  1. 学生通过考试 id 获取试卷 id

  2. 通过试卷 id 获取 试卷内容,并返回给学生

3. 学生考试结束流程

  1. 学生提交试卷

  2. 对于主观题 系统获取缓存的试卷答案进行打分

  3. 对于客观题 交由任课老师进行打分

  4. 生成学生的考试成绩

三、 考试试卷性能评估

1. 写性能

一个专业有 10 门课,一个学校 40 个专业,1000 万学生按每个学校 20000 学生计算,大概为 500 所学校,学校每学期进行一次期末考试,考试结束后试卷缓存就可以清除,所以缓存中只需要考虑一次期末考试即可

一个学校单次考试总数:10(门课)*40(专业)*4(个年级)=1600场考试总考试数量:1600(单个学校)*500 = 80万
复制代码

经过分析:单学期考试大概会有 80 万场考试,不考虑一场考试多套试卷情况(这种情况相对会少很多),会有 80 万份试卷数据缓存

一份试卷由 20 道判断题,20 道选择题,4 道大题组成,判断题、选择题:单题 200 字(600 字节),答题:单题 400 汉字(1200 字节),一份试卷大概:20*600+20*600+4*1200=28800字节=28KB,80 万份试卷需要 21GB 存储

总结:单节点 Redis 存储 80 万份考试没问题,使用 64GB 内存服务器即可

2. 读性能

根据第六讲考试性能分析:请求试卷为 5 万/每秒,对应 redis 来说 5 万读请求单节点应该没有压力。

试卷请求流量大概有 5 万*28KB≈1G,Redis 单节点无法满足读取要求,按照每个节点 100MB 的网络,需要 10 个节点可以满足网络吞吐要求,使用 Redis 主从架构或者 Redis sentinel 集群,每个节点存储全量数据

总结:由于网络吞吐的限制,需要 10 个 Redis 节点分摊读请求压力,采用 32G 内存服务器,100MB 带宽

3. 总结

平常教学期间: 学校考试集中在每学期末,平常使用人数相对较少,Redis 服务部署 3 个节点即可,使用 Redis sentinel 集群,方便在高峰期进行扩缩容

考试高峰期:大部分学校都会在学期末进行集中考试,使用 10 台 32G 内存服务器,每台需要 100MB 带宽,使用 Redis sentinel 集群进行读写分离,可以方便的进行横向扩展


用户头像

关注

还未添加个人签名 2018.08.10 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营 第 4 期 模块四作业