架构营模块四作业
1.Redis 的数据结构
学生的考试试卷根据题号是有顺序的,在老师添加试卷题目时可以按照顺序添加,同时学生读取试卷的时候同样可以按照顺序读取试题。基于此,可以选择 Redis 的 List 数据类型存储试卷内容。具体设计如下:
【出题时数据结构设计】
Key: 学校 ID+考试科目 ID
value: 按题号顺序存储的题目
【答题时数据结构设计】
Key: 学校 ID+学生 ID+考试科目 ID
value: 按题号顺序存储的对应的答案
2.具体的数据读写流程
老师出题的写流程:
老师按照具体的开始科目创建对应的 Key,然后按照题号顺序通过 RPUSH 命令添加题目。
学生读取题目流程:
学生根据考试科目对应的 Key,首先通过 LLEN 命令获取到总题数,然后再根据 LRANGE 命令获取试题。
学生提交试卷的写流程:
学生根据考试科目对应的 Key,可以按照题目顺序通过 RPUSH 命令将对应题目答案添加进去,或者可以通过 LSET 提交指定题号的答案。
3.服务器数量估算
对于 1000 万学生来说,鸡舍每个学校有 1 万学生,那么全国共有 1000 所学校。假设每个学校含有 50 个专业,每个专业每次考试 10 门课程,每次有 3 个年级参加考,假设每份试卷 5000 字,每个学生答案为 1000 字。
由以上假设可得:
所有试卷的容量为:1000(学校)*3(年级)*50(专业)*10(课程)*5000(字数) = 7.5G
所有答案的容量为:1000 万(学生)*10(课程)*1000(字数) = 100G
所以总容量为 107.5G,就按 110G 来算。
由以上结果可以得出每次的考试内容可以存储到一台拥有 128G 内存的服务器上就可以。但时考虑的学生刚开始考试时,请求量会比较大,而提交试卷时相对会小一些,所以可以考虑使用 Redis 的 sentinel 方案,将试卷数据读写做主从分布,有单一主节点处理老师出题和学生提交答案的请求,而由所有节点处理考试开始时的试卷读取请求。综合考虑,可以部署一主二从的主从架构,同时部署三台 sentinel,所以最终可以提供六台服务器作为解决方案。
版权声明: 本文为 InfoQ 作者【GTiger】的原创文章。
原文链接:【http://xie.infoq.cn/article/5627ffaf9b5a49065263a99c7】。文章转载请联系作者。
评论