架构实战营 - 模块 4- 作业
题目: 设计千万级学生管理系统的考试试卷存储方案
【作业要求】基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:1)完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构 2)设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)3)对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
【提示】1.性能可以有一定冗余 2.如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel
一. 考试试卷存储方案之 Redis 的数据结构设计
问卷使用 List 结构,存储在 redis 里,结构设计如下:
key: 学校 ID + 科目 + 试卷 ID(试卷 ID 全局唯一)
value: 一道题一个元素, 每个元素的结构:
{
"exam_question_id": 1, // 试题序号
"exam_question_content": "试题问题 1", //试题内容
"exam_question_type": 1, //试题类型: 1:单选题 2:多选题 3: 判断题 4: 主观题
"options": "{"A":"选项 A 内容","B":"选项 B 内容","C":"选项 C 内容","D":"选项 D 内容"}" // 选项,仅 exam_question_type 为 1 或 2 时才出现该元素
},
{
"exam_question_id": 2, // 试题序号
"exam_question_content": "估算的时候不一定要非常精确,有时候为了计算方便,可以四舍五入",
"exam_question_type": 3 //试题类型: 1:单选题 2:多选题 3: 判断题 4: 主观题
},
{
"exam_question_id": 3, // 试题序号
"exam_question_content": "如果考虑分区架构,整体存储架构如何设计?", //试题内容
"exam_question_type": 4 //试题类型: 1:单选题 2:多选题 3: 判断题 4: 主观题
}
二. Redis 的读写流程
读流程
当学生请求试卷的时候,通过 key 从 redis 中取获取试卷的内容,把 list 的内容反序列化出来,返给前端渲染即可
写流程
由教师通过 web 前端编辑试题录入 redis
三. Redis 的 sentinel 集群的服务器数量和性能评估
(图一)
![](https://static001.geekbang.org/infoq/a0/a0d4ac66e6a0c89dada8b5017a6f8ae5.png)
(图二)
![](https://static001.geekbang.org/infoq/7d/7d0c695cfbdd678330bf6992ec5b0b4c.png)
读性能分析
由之前分析可知,请求试卷的 QPS 为 5 万/s ,单机 redis 基本可以抗住,但是考虑到高可用,还是需要做 sentinel 集群
存储容量分析
根据教育部的数据,截至 2020 年 6 月 30 日,全国高校共计 3000 所左右,根据图一的推论,假设试卷问题的文字量是答案的 10 倍,那么试卷的每年的存储量为:
全国高校数量(3000) * 20(课) *2(考试次数) *10000(试卷问题)*2(学期)*1(1 年的考试)= 2.4G
以该系统需保持近 4 年的试卷来预估存储量,那么大约需要 9.6G 内存,单机 redis 基本可以抗住,但是考虑到高可用,还是需要做 sentinel 集群,共需 6 台服务器,集群配置如下:
Redis sentinel 3 台,保证自身高可用
Redis 1 主 2 从 共 3 台, 每台内存配置至少 16G
评论