【架构设计模块四】:设计千万级学生管理系统的考试试卷存储方案
作业要求
【作业要求】 基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构
设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)
对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
【提示】
性能可以有一定冗余
如果对 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 即可,数据结构如下:
不考虑其他的场景主要是:
string:足够简单
set:无需去重的场景
hash:过于复杂,获取题目不是很方便
list:获取题目比较方便,也适合分页场景——不过在试题中取决于显示器大小,一般不会某一页仅显示 N 条;而且题目不是很大,适合使用 list 存储
zset:完全不用考虑
故【数据结构设计】为:
key:学校 ID + 考试 ID
value:上述的 JSON string 结果
读写流程
试卷写入
假设这里有个自动生成试卷的功能,那流程是这样:
进入考试子系统,选择生成试卷
在题库中选择 20 选择题、20 判断题、4 问题题
确认生成试卷:
将具体题目转成 string 作为 value
根据学校 ID + 考试 ID 作为 key
写入 redis
试卷读取
进入考试子系统
获取试卷:基于学生所在的学校 ID + 参与的考试 ID 获取当场试卷
计算 Redis sentinel 集群的服务器数量和性能
上节的性能评估是:试卷读取 5 万/每秒
而一般 redis 的 KV 能达到 5W-10W
所以这里性能上理论上一台机器即可,但是考虑使用 Redis Sentinel,选择使用三台机器部署,绰绰有余
版权声明: 本文为 InfoQ 作者【Ryoma】的原创文章。
原文链接:【http://xie.infoq.cn/article/2b85195ccb8dc4b878a3581ed】。文章转载请联系作者。
评论