写点什么

【架构设计模块四】:设计千万级学生管理系统的考试试卷存储方案

用户头像
Ryoma
关注
发布于: 1 小时前

作业要求

【作业要求】 基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:

  1. 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构

  2. 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)

  3. 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能


【提示】

  1. 性能可以有一定冗余

  2. 如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel


解答

试题数据结构设计

基础类型:string、set、hash、list、zset


按 20 道选择题、20 道判断题、4 道大题推算:每个选择题 200 字节(题目 + 选择项),每个判断题 50 字节,每个大题 200 字节:

  • 20 * 200 + 20 * 50 + 4 * 200 ≈ 6K——按 10K 计算

  • 具体图片考虑引入 CDN,存储 URL 即可


单个 Value 没有超过 Redis 建议的值,且考虑页面排版就不分页存储,直接完整存储即可,将题目转成 JSON string 即可,数据结构如下:

{    "选择题":[        {            "题号":1,            "题目":"很长的题目描述",            "答案选择":[                "A. 答案A",                "B. 答案B",                "C. 答案C",                "D. 答案D"            ]        }    ],    "判断题":[        {            "题号":1,            "题目":"很长的判断题描述"        }    ],    "问答题":[        {            "题号":1,            "题目":"超长的问答题描述"        }    ]}
复制代码


不考虑其他的场景主要是:

  1. string:足够简单

  2. set:无需去重的场景

  3. hash:过于复杂,获取题目不是很方便

  4. list:获取题目比较方便,也适合分页场景——不过在试题中取决于显示器大小,一般不会某一页仅显示 N 条;而且题目不是很大,适合使用 list 存储

  5. zset:完全不用考虑


故【数据结构设计】为:

  • key:学校 ID + 考试 ID

  • value:上述的 JSON string 结果

读写流程

试卷写入

假设这里有个自动生成试卷的功能,那流程是这样:

  1. 进入考试子系统,选择生成试卷

  2. 在题库中选择 20 选择题、20 判断题、4 问题题

  3. 确认生成试卷:

  4. 将具体题目转成 string 作为 value

  5. 根据学校 ID + 考试 ID 作为 key

  6. 写入 redis

试卷读取

  1. 进入考试子系统

  2. 获取试卷:基于学生所在的学校 ID + 参与的考试 ID 获取当场试卷


计算 Redis sentinel 集群的服务器数量和性能

  • 上节的性能评估是:试卷读取 5 万/每秒

  • 而一般 redis 的 KV 能达到 5W-10W


所以这里性能上理论上一台机器即可,但是考虑使用 Redis Sentinel,选择使用三台机器部署,绰绰有余

发布于: 1 小时前阅读数: 3
用户头像

Ryoma

关注

学如逆水行舟 2018.05.14 加入

一只菜菜的全沾工程师

评论

发布
暂无评论
【架构设计模块四】:设计千万级学生管理系统的考试试卷存储方案