写点什么

学生管理系统考试试卷存储方案设计

作者:乖乖IvyShine
  • 2022-11-05
    江苏
  • 本文字数:1422 字

    阅读完需:约 5 分钟

前言

本文是千万级学生管理系统考试试卷存储系统的详细方案设计文档,用于指导后续数据存储的开发、测试和运维。

修订历史

[可选,文档会因为各种原因导致修订,通过修订历史来记录变更情况]

 

词汇表

Redis:Remote Dictionary Server,是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

1. 业务背景

对于千万级学生系统,在考试期间,学生在线考试时,对试卷数据的请求峰值高,且对系统的响应时长有较高要求,因此试卷的存储方案提出了以下几点要求:

1、高并发场景下,系统稳定可靠

2、较低的响应速度

2. 约束和限制

1、支撑 1000 万学生系统访问试卷存储系统

2、使用 redis 存储

3. 总体架构

试卷存储使用 redis cluster 存储,通过部署 redis sentinel 保证高可靠。

3.1 架构分析

数据估算:

学生数量 1000 万,假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时, 且请求试卷集中在考试开始的前 1 分钟,提交试卷的性能估算为 5 万请求/秒。

假设有 100 个学校,每个学校每年有 200 门课程需要考试,试卷各不相同,每年试卷数量为 2W。每份试卷包括 20 判断题、20 选择题、4 道大题(答案 200 字以 内)

3.1.1 高性能

如上面数据估算,试卷存储系统对查询性能要求比较高,同时试卷数据量比较小,试卷本身需要存储的内容比较少,故可以考虑使用 Redis 存储数据以供读取使用。

3.1.2 高可靠

由于每年的试卷数量相对比较平稳,不会出现突然变大、或者线性增长的情况,对存储系统的容量大小几乎没有什么压力,无需考虑后续扩容,故采用 redis sentinel 模式保证 redis 存储系统的高可靠。

考虑到试卷数据不能丢失,所以试卷数据保存到 redis 的同时,也要保存到 mysql 数据库一份(mysql 主备),降低数据丢失的可能性。

3.1.3 可扩展

试卷数据量比较小,暂不考虑可扩展性。

3.2 总体架构

1、采用 mysql 主备存储所有试卷数据,用于写试卷数据。

2、采用 redis sentinel 存储当年的试卷数据,用于读取试卷。

4. 详细设计

4.1 核心功能

1、考试月期间,教师登录学生管理系统,录入/修改试卷数据,删除相同 redis key 的数据,保存试卷数据到 mysql 数据库,再将数据保存到 redis 中(有效期为 2 个月),都保存成功则返回成功,数据失败则都返回失败,需要重新保存。

2、考试开始后,学生登录学生管理系统,获取考试的试卷编号信息,点击开始考试,去 redis 中获取试卷信息,如果试卷信息不存在,则需要去数据库中获取,并将试卷信息再保存到 redis 中。

3、考试结束,学生在学生管理系统中,提交试卷,将试卷结果信息保存到 HBase 数据库中。

4.2 关键设计

4.2.1 redis 数据结构

key:课程编号+年份+试卷编号

value:试卷数据使用 zset 数据结构保存,zset 中每个元素为一个实试题

有效期:1 个月

4.2.3 部署架构

redis sentinel 3 台集群

redis 1 主 2 从,内存:32G

4.3 设计规范

1、学生管理系统使用 java 开发,使用 redisson 开源组件接入 redis

5. 质量设计

5.1 可测试性

redis 有不少可视化工具可以直接查看 redis 资源情况,也可以通过工具(redis-rdb-tools)分析 redis 的性能使用情况。无需特殊设计。

5.2 可维护性

使用 redis 可视化工具维护,无需特别考虑

5.3 可观测性

使用 redis 可视化工具观测,无需特别考虑

5.4 成本

不涉及

6. 演进规划

[必选,可以是演进规划,也可以是项目计划,需要描述每个里程碑或者版本具体要实现的能力]

[样例:

6.1 消息队列一期

6.2 消息队列二期

]

[技巧:开发阶段快速迭代,小步快跑,但要基本完善后才能正式推出给其他人用]

 

用户头像

还未添加个人签名 2017-12-12 加入

还未添加个人简介

评论

发布
暂无评论
学生管理系统考试试卷存储方案设计_乖乖IvyShine_InfoQ写作社区