模块四作业:千万级试卷结构设计
复杂度来源:
考试过程:考试题的 redis 内存结构,试题加载到学生客户端
考试历史:考试完后的考试结果存储
结构设计
考试试卷内容分析和估算
试卷内容:
频率:每学期 20 门课程,每年考试 2 次,每次考试 1 小时,每天考 4 课
内容:20 道判断题,20 道选择题,4 道大题
性能:在校生 1000 万,每次考试为 1 小时,每个学生最大容量为 1000 万人同时考一门课程
1000 万人最大并发请求一份试卷
1000 万人要考试,(每天考 4 堂),平均到每分钟 60 秒, 约等于 5 万/秒的并发量
关键行为分析:
运营后台系统录入考试题
考题加载 redis 准备开始考试
开始考试每个学生生成一份考卷
考试结束后试卷在 Redis 中存储一个月,判卷完成,成绩封存后结果保存到 mysql
Redis 试卷存储结构设计:
整体架构采用哨兵模式
![](https://static001.geekbang.org/infoq/02/02bde81d7d041f8b373934f9b1b62aa1.png)
Redis 试卷存储方案设计
【基于 Hash 结构的课程试卷设计】
一个课程可能有多套试卷
key: 课程试卷前缀+课程 id
hash:field: 课程对应的试卷序号
hash:value: 单个试卷的 key
【试卷读写分析】
运营后台可为一个课程管理多套试卷和考题
【基于 zset 结构的单个试卷设计】
key: 试卷类型前缀+课程 id+试卷序号(单个试卷的 key)
value: 字符串 json,{试题类型,试题内容,试题分数}
scores: 加载的前后顺序
【试卷读写分析】
学生根据考试的课程随机选择一份试卷或指定试卷进行考试
学生个人考卷存储方案
【基于 Hash 结构的试卷设计】
key: 考试结果前缀+学生 id
hash:field: 课程 id
hash:value: 课程考试结果 json{试卷 Key,试题答案内容:{},试题分数}
【试卷读写分析】
根据学生 id 保存全部学生的试卷答题结果
读写流程
![](https://static001.geekbang.org/infoq/43/43ff26058ffe1f4079baf08b8185c9b6.png)
服务器数量和性能设计
![](https://static001.geekbang.org/infoq/ce/ce502371f3516101cd2c930c0b31ff62.png)
32 核服务单机 5~10 万 tps,而我们预估的并发在 5 万/秒
sentinel 节点采用 3 台 4 核 16G 的主机实例,
Redis 部署采用一主二从的主从部署结构,3 台机器采用 32 核 128G 配置
评论