模块四课后作业 - 设计千万级学生管理系统的考试试卷存储方案
作业要求
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。
• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。
• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。
1.数据结构设计
考试试卷一般是先由老师设计,学生答题完毕后在上传试卷。鉴于这两个步骤,老师设计的试卷只需要在 Redis 中存储一个 key 即可,考试时所有学生访问该 key 就可以看到试卷的内容,但是上传试卷的时候每个学生的答案不一样,所以需要针对每一个学生设计一个 key 来存储试卷。详细的数据结构如下:
1.1 设计、获取试卷数据结构
Key:String,学校 ID + 学院 ID+课程 ID(schoolId + academyId + courseId)
Value:String,采用 JSON 字符串
key 之所以要加上学校 ID+学院 ID+课程 ID,是因为后续如果该平台要多个学校使用的时候,避免键值不重复,另外同一所学校下面可能不同的学院的课程 ID 有重复,因此加上学院 ID 作为 Key 避免逐渐冲突
Value 采用 JSON 字符串来存储,JSON 字符串中的 key 表示题目的编号,value 再使用 json 格式存储题目的信息。这样保证了试卷的内容可以更好的扩展。例如:{"question1":{"type":"选择题",value:"xxxxxx"}}
老师在设计试卷的时候,选择学校 ID+学院 ID+课程 ID,业务系统将老师设计好的试卷拼装成 json,上传到 redis 中。学生在获取试卷的时候,也根据学生的学校 ID+学院 ID+参加考试的课程 ID 来读取试卷。
1.2 上传试卷数据结构
采用 hash 类型
key:学校 ID + 学院 ID + 课程 ID
field:学生学号
value:试卷答题内容(JSON 字符串)
以学校 ID+学院 ID+课程 ID 作为 key,方便老师在批阅试卷的时候查询该课程下所有学生的试卷
以学生学号作为 field 用以区分每个学生的试卷,value 就是每个学生的答题内容
2.录入试卷流程图
读取试卷流程图:
提交、暂存试卷流程图:
Redis sentinel 集群的服务器数量:
【服务器数量】
1 台 redis master+2 台 redis slave,合计 3 台 redis 服务器
3 台 sentinel 机器提供监控确保高可用
所以总共需要 6 台服务器
【服务器性能】
3 台数据节点服务器,redis 单台性能可达到 5W - 10W,3 台可以达到 15W - 30W,满足 5w 的 QPS 需求;
评论